मैंने विभिन्न परियोजनाओं/डेटाबेस के लिए एक ही ऐप का उपयोग करने के लिए this उत्तर से प्रेरित यूआरएल आधारित डेटाबेस रूटिंग सेट अप किया है। परियोजनाओं को किसी भी डेटा को साझा करने की आवश्यकता नहीं है, प्रत्येक प्रोजेक्ट द्वारा अभिगम नियंत्रण प्रबंधित किया जाता है और मुझे प्रत्येक परियोजना के लिए एक व्यवस्थापक साइट की आवश्यकता होती है। मूल पोस्ट के रूप में मैं डेटाबेस राउटर और एक मिडलवेयर का उपयोग करता हूं जो निर्धारित करता है कि अनुरोध पथ से कौन से डेटाबेस का उपयोग किया जाना चाहिए, उदा। /test/process/1
डेटाबेस test
और /default/process/2
डेटाबेस default
पर स्थानांतरित किया जाएगा।यूआरएल आधारित डेटाबेस रूटिंग
import threading
from django.conf import settings
request_cfg = threading.local()
class RouterMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
path = request.path.lstrip('/').split('/')
if path[0] in settings.DATABASES:
request_cfg.db = path[0]
def process_response(self, request, response):
if hasattr(request_cfg, 'db'):
del request_cfg.db
return response
class DatabaseRouter(object):
def _default_db(self):
if hasattr(request_cfg, 'db') and request_cfg.db in settings.DATABASES:
return request_cfg.db
else:
return 'default'
def db_for_read(self, model, **hints):
return self._default_db()
def db_for_write(self, model, **hints):
return self._default_db()
url प्रतिमानों तो सब-पाथ जो एक विशिष्ट डेटाबेस को संदर्भित करता है शामिल करने के लिए बढ़ाया जा करने की जरूरत है। मैं इस तरह परियोजना स्तर urls.py में यूआरएल हार्डकोड द्वारा ऐसा किया:
urlpatterns = [
url(r'^default/admin/', include(admin.site.urls)), # does not work
url(r'^test/admin/', include(admin.site.urls)), # does not work
url(r'^default/', include('logbook.urls', namespace='anything')),
url(r'^test/', include('logbook.urls', namespace='anything else'))]
मैं स्वीकार करते हैं कि यह बहुत अच्छा नहीं है, लेकिन मैं कुछ डेटाबेस से भी अधिक का प्रबंधन करने के लिए उम्मीद नहीं है। दिलचस्प बात यह है कि इससे कोई फर्क नहीं पड़ता कि नेमस्पेस तर्क क्या है लेकिन इसे देना होगा। ऐप का मूल नामस्थान logbook
था और इसका उपयोग पूरे ऐप के दृश्यों और टेम्पलेट्स पर उलटा करने के लिए किया जाता है।
फिर, अनुप्रयोग स्तर में urls.py app_name परिभाषित किया गया है करने के लिए किया जा (और मूल नाम स्थान के बराबर हो):
app_name = 'logbook'
urlpatterns = [
url(r'^$', views.redirect_index, name='index'),
url(r'^(?P<date>[0-9]{4}[0-9]{2})/$', views.Index.as_view(), name='index'),
.....
दृश्यों में मैं के रूप में reverse()
के हर कॉल करने के लिए एक current_app=request.resolver_match.namespace
kwarg जोड़ा django दस्तावेज़ों में समझाया। यूआरएल को हल करने के लिए टेम्पलेट्स को किसी भी संशोधन की आवश्यकता नहीं थी।
कुल मिलाकर यह दो अपवादों को छोड़कर बहुत अच्छी तरह से काम करता है:
- यूआरएल व्यवस्थापक से किसी भी दृश्य के लिए पीछे हमेशा urls.py में पहली प्रविष्टि के लिए हल होगा
- मैं इसे
django.contrib.auth.middleware.AuthenticationMiddleware
ज्यादातर के साथ काम नहीं कर सकता , मुझे लगता है क्योंकिLOGIN
औरLOGIN_REDIRECT
स्थिरांक हैं।
मुझे आश्चर्य है कि यह एक साफ दृष्टिकोण है और यदि ऊपर वर्णित दो अपवादों का समाधान है। यदि नहीं, तो बेहतर समाधान क्या होगा?
आप कैसे तैनात कर रहे हैं? मुझे लगता है कि करने के लिए सबसे अच्छी बात यह है कि आपके सर्वर की कॉन्फ़िगरेशन में यूआरएल को ट्रिगर करना होगा, उदा। अपाचे, और उसके बाद बस दो पूरी तरह से अलग django wsgi अनुप्रयोगों का उपयोग करें ताकि आपको इनमें से किसी के बारे में चिंता न करें। मुझे नहीं लगता कि django व्यवस्थापक ऐप कई डेटाबेस के साथ अच्छी तरह से खेलने जा रहा है। आपको एक डेटाबेस में व्यवस्थापक और ऑथ आदि डेटाबेस को केंद्रीकृत करके कुछ लाभ मिल सकता है, हालांकि यदि आपको एकाधिक उपयोगकर्ता डेटाबेस की आवश्यकता नहीं है। – daphtdazz
मैंने अभी तक तैनाती के बारे में सोचा नहीं है, मैं अजगर वेबसर्वर के साथ काम कर रहा हूं। वैसे भी मुझे उम्मीद है कि और अधिक समस्याएं होंगी, उदा। मीडिया फ़ाइलों के साथ और जैसा कि आप कहते हैं, ऐसा प्रतीत नहीं होता है कि व्यवस्थापक ऐप एकाधिक डेटाबेस के साथ काम करेगा। मैं शायद सभी को एक डेटाबेस में छोड़ दूंगा। आपके विचारों के लिए धन्यवाद। –