2011-02-01 14 views
10

क्या प्रोग्राम को क्रमशः सर्वर को पुनरारंभ किए बिना Django में URL पैटर्न जोड़ने का कोई तरीका है?प्रोग्रामेटिक रूप से Django में यूआरएल पैटर्न जोड़ें?

या क्या डीजेगो को URL पैटर्न (URLconf) को पुन: संसाधित/कैश करने का कोई तरीका है?

+1

आप 'mod_wsgi' का उपयोग कर रहे हैं? यदि ऐसा है, तो आप पूरे अपाचे सर्वर को पुनरारंभ किए बिना अपने ऐप को पुनरारंभ कर सकते हैं। –

+0

@ एसएलॉट उत्पादन सर्वर के लिए हाँ, तो यह काम कर सकता है, आप एक विशिष्ट ऐप को कैसे पुनरारंभ करते हैं? क्या देव सर्वर के लिए कुछ भी समान है? –

+0

@ एसएलओटी, 'देव सर्वर' के लिए मेरा मतलब है कि ब्यूट-इन डेवलपमेंट सर्वर जो Django के साथ आता है, उदाहरण के लिए: python manage.py runerver। मैंने आपकी पहली टिप्पणी को गलत समझा होगा, हालांकि, क्या आप सुझाव दे रहे थे कि एक अन्य Django ऐप को अन्य ऐप्स को पुनरारंभ किए बिना पुनरारंभ करना संभव है, या आप सुझाव दे रहे थे कि आप अपाचे को पुनरारंभ किए बिना Django/सभी ऐप्स को पुनरारंभ कर सकते हैं? मुझे पूर्व करने की ज़रूरत होगी। –

उत्तर

3

यदि आप कोड प्रीलोडिंग के बिना बंदूक का उपयोग करते हैं, तो बस बंदूकधारी मास्टर प्रक्रिया में एक एचयूपी भेजें, यह नए श्रमिकों को जन्म देगा जो नए कोड को लोड करेंगे, और पुराने खोए गए अनुरोधों को बिना किसी खोए अनुरोध के बंद कर देंगे!

3

मैंने django.core.urlresolvers में कुछ चीजों को हैक करके इस तरह कुछ करने की कोशिश की - यह मेरे लिए काम करता था लेकिन ध्यान दें कि यह हैक है। मैं अभी भी कोड नहीं है, लेकिन मैं कुछ इस तरह किया:

  1. Django आम तौर पर urlresolvers.get_resolver() का उपयोग करता है एक RegexURLResolver जो यूआरएल को हल करने के लिए जिम्मेदार है पाने के लिए। इस फ़ंक्शन में None पास करने से आपका "रूट" URLConf हो जाता है।
  2. get_resolver() लोड किए गए URLConfs के लिए कैश, _resolver_cache का उपयोग करता है।
  3. _resolver_cache को रीसेट करने से Django को एक स्वच्छ URLResolver को फिर से बनाने के लिए मजबूर होना चाहिए।

वैकल्पिक रूप से, आप रूट RegexURLResolver है, जो इसे फिर से लोड करने के लिए Django के लिए मजबूर करना चाहिए की _urlconf_module विशेषता अनसेट करने के लिए कोशिश कर सकते हैं (इस बारे में निश्चित नहीं है, हालांकि, यह संभव है कि मॉड्यूल अजगर द्वारा कैश किया जाएगा)।

from urlresolvers import get_resolver 

delattr(get_resolver(None), '_urlconf_module') 

फिर, इसकी गारंटी नहीं है कि इस काम करेंगे (मैं कोड से याद है कि मैं स्पष्ट रूप से किसी कारण से खारिज कर दिया है, वहां से काम कर रहा हूँ)। लेकिन django/core/urlresolvers.py निश्चित रूप से वह फ़ाइल है जिसे आप देखना चाहते हैं।

संपादित करें: इस के साथ कुछ प्रयोग करने के लिए निर्णय लिया है और यह काम नहीं किया ...

EDIT2:

के रूप में मैंने सोचा, अपने URL मॉड्यूल अजगर द्वारा संचित किया जाएगा। बस उन्हें पुनः लोड करना क्योंकि वे बदल सकते हैं (reload का उपयोग कर)। यदि, आपकी समस्या यह है कि आप कुछ डेटा के आधार पर urlpatterns गतिशील रूप से निर्माण कर रहे हैं जो बदल सकता है।

मैंने अपने रूट यूआरएल (project.urls) और एक उपन्यास मॉड्यूल (app.urls) में reload कोशिश की। get_resolver(None).url_patterns

द्वारा प्रदर्शित होने वाले नए यूआरएल के लिए मुझे बस इतना करना था कि चाल यह आसान हो सकती है: मैन्युअल रूप से अपना यूआरएल मॉड्यूल पुनः लोड करें।

+0

जब मुझे मौका मिलता है तो मैं इसके साथ खेलूँगा और देख सकता हूं कि यह काम करता है या नहीं। –

संबंधित मुद्दे