8

スレッドセーフな方法で、セッション内のデータに基づいてurlpatternsを動的に生成する必要があります。

これは、URLの解決を後回しにするカスタムURLResolverを介して実装しました。ミドルウェアから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
4

1 に答える 1

0

実際には、これをミドルウェアとして実装する方が高速であり、より多くの制御ができるため、より良いと言えます。

おそらく、関数に送信する予定のデータと可能な出力について詳しく示すことができます。

ユースケースの詳細は良いでしょう。

于 2013-06-17T20:16:45.693 に答える