Django,动态 urlconfs,线程安全

Posted

技术标签:

【中文标题】Django,动态 urlconfs,线程安全【英文标题】:Django, dynamic urlconfs, thread-safety 【发布时间】:2012-06-05 05:11:26 【问题描述】:

我需要以线程安全的方式根据会话中的数据动态生成 urlpatterns。

我通过自定义 URLResolver 实现了这一点,该 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

【问题讨论】:

为什么需要线程? 【参考方案1】:

我会说你实际上最好将它作为中间件来实现,因为它可能会更快并且给你更多的控制权。

也许您可以详细说明您计划提交给函数的数据以及可能的输出。

更多关于用例的细节会很好。

【讨论】:

以上是关于Django,动态 urlconfs,线程安全的主要内容,如果未能解决你的问题,请参考以下文章

使用 django 访问数据库的线程安全方法

03 Django的路由层-1(URLconf)

django sql线程安全吗?

为啥在 Django 中使用线程局部变量不好?

线程安全和线程不安全的区别

Django:在中间件中用 request.urlconf 覆盖 ROOT_URLCONF