我需要以线程安全的方式根据会话中的数据动态生成urlpatterns。
我通过自定义URLResolver实现了这一点,该URLResolver将URL解析推迟到以后。我知道从中间件设置request.urlconf;但有理由我不能这样做(Django缓存解析器,在我的情况下会导致无限制的内存使用)。
我需要有人看看实现,看看我是否正确处理了线程安全。
谢谢!
代码:
的myapp / urls.py:
urlpatterns = patterns('',
# other urlconfs
url(r'^/foo', include('foo.urls')),
)
富/ 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()]
富/ 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)
我会说你实际上更好地将它作为中间件实现,因为它可能更快并且可以让你获得更多控制权。
也许您可以更多地了解您计划提交给该功能的数据和可能的输出。
关于用例的更多细节会很好。