2012-05-30 23 views
7

Potrzebuję dynamicznie generować urlwzory na podstawie danych w sesji w sposób bezpieczny dla wątków.Django, dynamiczne adresy URL, bezpieczeństwo wątków

Zaimplementowałem to za pomocą niestandardowego URLResolver, który rozróżnia rozwiązywanie adresów URL na później. Wiem o ustawieniu request.urlconf z middleware; ale są powody, dla których nie mogę tego zrobić (Django buforuje przeliczniki, aw moim przypadku spowodowałoby użycie nieograniczonej pamięci).

Potrzebuję kogoś, kto przyjrzy się implementacji i zobaczę, czy poprawnie obchodziłem się z bezpieczeństwem wątków.

Dzięki!

Kod:

MojaApl/urls.py:

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

bla/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()] 

bla/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

Dlaczego potrzebujesz gwintowania? –

Odpowiedz

0

Powiedziałbym, że w rzeczywistości lepiej sobie radzisz jest to oprogramowanie typu Middleware, ponieważ może być szybsze i zapewnia większą kontrolę.

Być może możesz wyświetlić więcej informacji na temat danych, które planujesz przesłać do funkcji i możliwych wyników.

Więcej szczegółów na temat użycia byłoby dobrze.

Powiązane problemy