2012-05-30 2 views
7

Мне нужно динамически генерировать URL-адреса на основе данных в сеансе потокобезопасным способом.Django, dynamic urlconfs, безопасность потоков

Я реализовал это с помощью настраиваемого URLResolver, который откладывает разрешение URL-адресов до тех пор, пока он не появится. Я знаю об установке request.urlconf из промежуточного программного обеспечения; но есть причины, по которым я не могу этого сделать (Django кэширует резольверы, и в моем случае это приведет к неограниченному использованию памяти).

Мне нужно, чтобы кто-то взглянул на реализацию и посмотрел, правильно ли я исправил эту проблему.

Спасибо!

Код:

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

Зачем вам нарезание резьбы? –

ответ

0

Я бы сказал, что вам действительно лучше реализовать это как промежуточное ПО, поскольку оно может быть быстрее и дает вам больше контроля.

Возможно, вы могли бы узнать больше о том, какие данные вы планируете представить в функцию и возможные выходы.

Подробнее об использовании будет хорошо.

Смежные вопросы