2012-05-30 26 views
7

Tôi cần tạo động các mẫu url dựa trên dữ liệu trong phiên theo cách an toàn.Django, urlconfs động, an toàn chủ đề

Tôi đã triển khai điều này thông qua URL tùy chỉnhResolver giúp giảm độ phân giải url cho đến sau này. Tôi biết về việc thiết lập request.urlconf từ một middleware; nhưng có những lý do tôi không thể làm điều đó (Django cache giải quyết, và trong trường hợp của tôi sẽ dẫn đến việc sử dụng bộ nhớ không bị chặn).

Tôi cần ai đó xem xét triển khai và xem liệu tôi có xử lý chính xác an toàn chỉ hay không.

Cảm ơn!

Mã:

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

Tại sao bạn cần luồng? –

Trả lời

0

Tôi sẽ nói rằng bạn thực sự tốt hơn khi triển khai đây là Middleware vì nó có thể nhanh hơn và giúp bạn kiểm soát nhiều hơn.

Có lẽ bạn có thể hiển thị thêm về dữ liệu bạn dự định gửi cho hàm và các đầu ra có thể có.

Thêm chi tiết về trường hợp sử dụng sẽ là tốt.