2012-05-30 21 views
7

मुझे थ्रेड-सुरक्षित तरीके से सत्र में डेटा के आधार पर गतिशील रूप से urlpatterns उत्पन्न करने की आवश्यकता है।Django, गतिशील urlconfs, थ्रेड-सुरक्षा

मैंने इसे एक कस्टम यूआरएल रीसोलवर के माध्यम से कार्यान्वित किया जो यूआरएल को बाद में हल करने से रोकता है। मैं requestwurconf को मिडलवेयर से सेट करने के बारे में जानता हूं; लेकिन ऐसे कई कारण हैं जो मैं नहीं कर सकता (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

मैं कहूंगा कि आप वास्तव में कार्यान्वित करने से बेहतर हैं यह मिडलवेयर के रूप में यह तेज़ हो सकता है और आपको अधिक नियंत्रण दे सकता है।

शायद आप इस बारे में और अधिक दिखा सकते हैं कि आप फ़ंक्शन और संभावित आउटपुट को सबमिट करने के लिए किस डेटा की योजना बना रहे हैं।

उपयोग के मामले पर अधिक जानकारी अच्छी होगी।