2017-04-03 8 views
6

मैंने विभिन्न परियोजनाओं/डेटाबेस के लिए एक ही ऐप का उपयोग करने के लिए 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 स्थिरांक हैं।

मुझे आश्चर्य है कि यह एक साफ दृष्टिकोण है और यदि ऊपर वर्णित दो अपवादों का समाधान है। यदि नहीं, तो बेहतर समाधान क्या होगा?

+2

आप कैसे तैनात कर रहे हैं? मुझे लगता है कि करने के लिए सबसे अच्छी बात यह है कि आपके सर्वर की कॉन्फ़िगरेशन में यूआरएल को ट्रिगर करना होगा, उदा। अपाचे, और उसके बाद बस दो पूरी तरह से अलग django wsgi अनुप्रयोगों का उपयोग करें ताकि आपको इनमें से किसी के बारे में चिंता न करें। मुझे नहीं लगता कि django व्यवस्थापक ऐप कई डेटाबेस के साथ अच्छी तरह से खेलने जा रहा है। आपको एक डेटाबेस में व्यवस्थापक और ऑथ आदि डेटाबेस को केंद्रीकृत करके कुछ लाभ मिल सकता है, हालांकि यदि आपको एकाधिक उपयोगकर्ता डेटाबेस की आवश्यकता नहीं है। – daphtdazz

+0

मैंने अभी तक तैनाती के बारे में सोचा नहीं है, मैं अजगर वेबसर्वर के साथ काम कर रहा हूं। वैसे भी मुझे उम्मीद है कि और अधिक समस्याएं होंगी, उदा। मीडिया फ़ाइलों के साथ और जैसा कि आप कहते हैं, ऐसा प्रतीत नहीं होता है कि व्यवस्थापक ऐप एकाधिक डेटाबेस के साथ काम करेगा। मैं शायद सभी को एक डेटाबेस में छोड़ दूंगा। आपके विचारों के लिए धन्यवाद। –

उत्तर

2

यह वह लेख है जिसे आप ढूंढ रहे हैं।

Django Multi DB Documentation

यह कैसे अपने एकाधिक डाटाबेस स्थापित करने के लिए, और व्यवस्थापक कंसोल उसके साथ काम करने के लिए बताते हैं। जैसा कि यह कहता है कि आपको अपने दूसरे डीबी (जो डिफ़ॉल्ट नहीं है) के लिए एक कस्टम मॉडल बनाने की आवश्यकता है और दस्तावेज़ीकरण में दी गई विधि का उपयोग करके इसे पंजीकृत करें।

+0

मैंने पहले इस पृष्ठ को पढ़ा लेकिन स्पष्ट रूप से व्यवस्थापक इंटरफ़ेस के बारे में अनुभाग में नहीं।प्रमाणीकरण मिडलवेयर के साथ समस्या बनी हुई है, हालांकि। इस पल के लिए मैंने विचार छोड़ने और सभी परियोजनाओं के लिए बड़े डेटाबेस बनाने का फैसला किया। –

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