2012-05-30 11 views
7

Necesito generar dinámicamente patrones url basados ​​en datos en la sesión de una manera segura para hilos.Django, urlconfs dinámicos, seguridad de hilos

Implementé esto a través de un URLResolver personalizado que difiere la resolución de URL hasta más tarde. Sé sobre establecer request.urlconf desde un middleware; pero hay razones por las que no puedo hacer eso (Django almacena en caché los resolvedores, y en mi caso resultaría en un uso ilimitado de la memoria).

Necesito a alguien que eche un vistazo a la implementación y vea si he manejado correctamente la seguridad de la hebra.

Gracias!

el código:

miaplicacion/urls.py:

urlpatterns = patterns('', 
    # other urlconfs 
    url(r'^/foo', include('foo.urls')), 
) 

foo/urls.py:

import threading 
from django.core.urlresolvers import ResolverMatch 

class MyResolver(RegexURLResolver): 
    def __init__(self): 
     self.resolver = threading.local() 
     return super(MyResolver, self).__init__(r'', None) 

    @property 
    def urlconf_module(self): 
     return self.resolver.value 

    def resolve(self, path): 
     def view(request): 
      resolver = request.session.get('myresolver', 'default') 
      resolver = getattr(import_module('foo.resolvers'), resolver) 
      self.resolver.value = resolver() 
      view, args, kwags = super(MyResolver, self).resolve(path) 
      return view(request, *args, **kwargs) 
     return ResolverMatch(view,(), {}) 

urlpatterns = [MyResolver()] 

foo/resolvers.py:

class default(object): 
    @property 
    def urlpatterns(self): 
     return patterns('foo.views', 
      url(r'', 'error'), 
     ) 

class test(object): 
    @property 
    def urlpatterns(self): 
     return dynamically_generated_urlpatterns 
+0

¿Por qué es necesario enhebrar? –

Respuesta

0

Yo diría que en realidad estás mejor sin implementar esto como Middleware, ya que podría ser más rápido y darle más control.

Quizás pueda mostrar más acerca de qué datos tiene previsto enviar a la función y posibles resultados.

Más detalles sobre el caso de uso sería bueno.

Cuestiones relacionadas