2014-11-17 22 views
6

Ich muss Django Entwicklungs- und Produktionseinstellungen teilen. Ich entschied, dass, wenn USKOVTASK_PROD Variable gesetzt ist, dann App Produktionseinstellungen verwenden sollte. Ich las this Artikel und versuchte es zu tun.Django + mod_wsgi. Set OS Umgebungsvariable von Apache SetEnv

Meine Schnipsel:

/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 des Teil:

import os 

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

Aber es importiert immer settings_dev Einstellungen. Warum?

+0

Können Sie debuggen und überprüfen, ob USKOVTASK_PROD wirklich in os.environ setzt? Sie können dafür einen einfachen Ausdruck platzieren. – iamkhush

+0

@iamkhush USKOVTASK_PROD ist in os.enivron, wenn ich es in 'wsgi.py' drucken, aber nicht in' settings.py' – michaeluskov

+0

Können Sie, wenn die Anweisung überprüfen „wenn‚USKOVTASK_PROD‘in environ“ wahr ist, durch Druck setzen, nachdem sie . – iamkhush

Antwort

4

Dieser Zusammenhang Access Apache SetEnv variable from Django wsgi.py file

Sie WSGIHandler erben müssen in Frage zu stellen, wie die Antwort sagt.

Als Graham Dumpleton in der zweiten Antwort erklärt,

Das alles gesagt, Sie die Blog-Post erwähnen wird nicht helfen in der Regel. Diese ist, weil es die fiesen Trick des Einstellens der Prozess Umgebungsvariablen auf jede Anfrage auf die pro Anfrage environ Einstellungen WSGI basiert verwenden Set mit SetEnv in Apache. Dies kann verschiedene Probleme in einer Multi Threading-Konfiguration verursachen, wenn die Werte der Umgebungsvariablen abhängig vom URL-Kontext abweichen können. Für den Fall von Django ist es nicht hilfreich, da das Django-Einstellungsmodul normalerweise importiert würde, bevor irgendwelche Anforderungen behandelt wurden, was bedeutet, dass die Umgebungsvariablen nicht zur Zeit erforderlich wären.

und ich denke, das ist, was in Ihrem Fall passiert.

6

ich dieses Problem gelöst, indem wsgi.py zu diesem Wechsel:

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

Kann bestätigen, dass dies für mich mit Apache/2.2.22 (Debian), mod_wsgi/4.4.8, Python/3.4.2, Django/1.7.3 funktioniert (Natürlich, nachdem 'USKOVTASK_PROD' und 'uskovtask.settings' geändert wurden) um meine ENV-Variable und App-Name zu entsprechen.) –

+0

Ich war mit Django 1.6 und env Vars waren in Ordnung, dann habe ich auf Django 1.8 aktualisiert und env Vars wurden überhaupt nicht geladen und ich bekam Standardwerte überall ... Dann ich habe deine Antwort gefunden! Ich denke, das ist der Weg für Django> 1,6, danke! –

Verwandte Themen