2014-11-17 5 views
6

से ओएस पर्यावरण चर सेट करें मुझे Django के विकास और उत्पादन सेटिंग्स को विभाजित करने की आवश्यकता है। मैंने फैसला किया कि यदि USKOVTASK_PROD चर सेट किया गया है, तो ऐप को उत्पादन सेटिंग्स का उपयोग करना चाहिए। मैंने this लेख पढ़ा और इसे करने की कोशिश की।Django + mod_wsgi। अपाचे के SetEnv

मेरे स्निपेट:

/etc/apache2/sites-enabled/uskovtask.conf:

<VirtualHost *:80> 

ServerName uskovtask.*.com 
ServerAlias uskovtask.*.com 
DocumentRoot /mnt/ebs/uskovtask 


Alias /static /mnt/ebs/uskovtask/static/ 
<Directory /mnt/ebs/uskovtask/static> 
    Require all granted 
</Directory> 

#WSGIPythonPath /mnt/ebs/uskovtask 
WSGIDaemonProcess uskovtask.*.com python-path=/mnt/ebs/uskovtask:/usr/lib/python2.7/site-packages 
WSGIProcessGroup uskovtask.*.com 
WSGIScriptAlias//mnt/ebs/uskovtask/uskovtask/wsgi.py 
SetEnv USKOVTASK_PROD 1 


<Directory /mnt/ebs/uskovtask/uskovtask> 
<Files wsgi.py> 
    Require all granted 
</Files> 
</Directory> 

</VirtualHost> 

wsgi.py:

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "uskovtask.settings") 

from django.core.wsgi import get_wsgi_application 

_application = get_wsgi_application() 

def application(environ, start_response): 
    if 'USKOVTASK_PROD' in environ: 
     os.environ.setdefault('USKOVTASK_PROD', environ['USKOVTASK_PROD']) 
    return _application(environ, start_response) 

settings.py के भाग:

import os 

if 'USKOVTASK_PROD' in os.environ: 
    from settings_prod import * 
else: 
    from settings_dev import * 

लेकिन यह हमेशा सेटिंग्स_dev की सेटिंग्स आयात करता है। क्यूं कर?

+0

आप डिबग और सत्यापित करें कि USKOVTASK_PROD वास्तव में os.environ में सेट कर सकते हैं? आप इसके लिए एक साधारण प्रिंट रख सकते हैं। – iamkhush

+0

@iamkhush USKOVTASK_PROD os.enivron में है यदि मैं इसे 'wsgi.py' में मुद्रित करता हूं, लेकिन 'settings.py' – michaeluskov

+0

में नहीं, तो क्या आप सत्यापित कर सकते हैं कि" if "USKOVTASK_PROD" वातावरण में "कथन के बाद प्रिंट रखना सही है या नहीं । – iamkhush

उत्तर

4

इस सवाल का Access Apache SetEnv variable from Django wsgi.py file

आप WSGIHandler वारिस के रूप में जवाब का कहना है की जरूरत से संबंधित है।

ग्राहम Dumpleton दूसरा जवाब में बताते हैं,

सभी ने कहा कि, ब्लॉग पोस्ट आप का उल्लेख आम तौर पर मदद नहीं करेगा। यह ऐसा इसलिए है क्योंकि यह अपाचे में SetEnv का उपयोग करके प्रति अनुरोध WSGI पर्यावरण सेटिंग सेट के आधार पर प्रत्येक अनुरोध पर पर्यावरण चर सेट करने की ग़लत चाल का उपयोग कर रहा है। पर्यावरण चर के मान URL संदर्भ के आधार पर भिन्न हो सकते हैं, तो यह एकाधिक थ्रेडिंग कॉन्फ़िगरेशन में विभिन्न समस्याएं पैदा कर सकता है। Django के मामले में, यह सहायक नहीं है क्योंकि Django सेटिंग्स मॉड्यूल सामान्य रूप से किसी भी अनुरोध को संभालने से पहले आयात किया जाएगा, जिसका अर्थ है कि पर्यावरण चर आवश्यक समय पर उपलब्ध नहीं होंगे।

और मुझे लगता है कि यह आपके मामले में हो रहा है।

6

मैं इस के लिए wsgi.py बदलकर इस समस्या का समाधान:

from django.core.handlers.wsgi import WSGIHandler 
import django 
import os 

class WSGIEnvironment(WSGIHandler): 

    def __call__(self, environ, start_response): 

     os.environ['USKOVTASK_PROD'] = environ['USKOVTASK_PROD'] 
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "uskovtask.settings") 
     django.setup() 
     return super(WSGIEnvironment, self).__call__(environ, start_response) 

application = WSGIEnvironment() 
+1

यह पुष्टि कर सकता है कि यह मेरे लिए अपाचे/2.2.22 (डेबियन), mod_wsgi/4.4.8, पायथन/3.4.2, Django/1.7.3 (बेशक, 'USKOVTASK_PROD' और 'uskovtask.settings' को बदलने के बाद मेरे लिए काम किया है। मेरे एनएनवी चर और ऐप नाम से मेल खाने के लिए।) –

+0

मैं Django 1.6 का उपयोग कर रहा था और env vars ठीक काम कर रहे थे, फिर मैंने Django 1.8 में अपडेट किया और env vars बिल्कुल लोड नहीं हो रहे थे और मुझे हर जगह डिफ़ॉल्ट मान दिए गए थे ... फिर मैं आपका जवाब मिला! मुझे लगता है कि यह Django> 1.6 के लिए जाने का मार्ग है, धन्यवाद! –

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