2014-11-09 8 views
6

È normale che le persone abbiano difficoltà a configurare django per essere servite da apache e mod-wsgi. Il sintomo comune è "Errore di importazione" ... per qualche motivo (generalmente leggermente diverso in ogni caso), settings.py o simili non vengono importati (vedi "Correlati" nella colonna di destra in questa pagina per numerosi esempi!).Come eseguire il debug dei problemi di base per configurare django per essere servito con apache e mod-wsgi?

Ho letto le altre domande su questo argomento e nessuno sembra avere una soluzione che funzioni per la mia situazione (uno era un errore di base del manifesto identificato da un rispondente - non sembra che abbia questo problema , altri si applicano all'utilizzo di wsgi da altri moduli, ecc.).

Quando apache/mod-wsgi non riesce a caricare, come si può eseguire il debug?

Cosa si può fare per creare qualcosa che ti dia un messaggio migliore di "Errore di importazione"?

Ovviamente, sto cercando un metodo che identifichi cosa c'è di sbagliato nel mio caso. Ma mi piacerebbe davvero sapere come affrontare il debug di questo tipo di errore: non sembra esserci alcun modo per trovare informazioni su ciò che sta causando il fallimento.


Nel mio caso, io sto cercando di fare quello che sembra essere uno straightforwards Django distribuire con mod-WSGI - davvero da manuale, lo stesso del documento, ma l'errore:

ImportError: Could not import settings 'cm_central.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named cm_central.settings 

Non riesco a vedere perché non riesce a trovare questo modulo.

/home/cmc/src/cm_central/cm_central/settings.py esiste, può essere caricato da pythonn senza errori, e infatti funziona correttamente con ./manage.py runserver.

È possibile che si verifichi qualche errore di importazione nel contesto di apache, che non si verifica quando lo carico da solo? Mi chiedo a causa delle parole "C'è un errore di importazione nel file delle impostazioni?" ... perché lo chiede? Se ci fosse un errore di importazione, come dovrei eseguirne il debug?

ho questo in/etc/apache2/sites-enabled/cm-centrale:

<VirtualHost *:80> 

    WSGIScriptAlias//home/cmc/src/cm_central/cm_central/wsgi.py 
    WSGIDaemonProcess cm-central.johalla.de python-path=/home/cmc/src/cm_central:/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages 
    WSGIProcessGroup cm-central.johalla.de 

    <Directory /home/cmc/src/cm_central/cm_central> 
    <Files wsgi.py> 
     Order deny,allow 
     Allow from all 
    </Files> 
    </Directory> 

</VirtualHost> 

E questo a wsgi.py: (che ho non modificati da ciò che Django generato)

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

from django.core.wsgi import get_wsgi_application 
from dj_static import Cling 

application = Cling(get_wsgi_application()) 

Il traceback completo è:

[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] mod_wsgi (pid=10273): Target WSGI script '/home/cmc/src/cm_central/cm_central/wsgi.py' cannot be loaded as Python module. 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] mod_wsgi (pid=10273): Exception occurred processing WSGI script '/home/cmc/src/cm_central/cm_central/wsgi.py'. 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] Traceback (most recent call last): 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/src/cm_central/cm_central/wsgi.py", line 16, in <module> 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]  application = Cling(get_wsgi_application()) 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]  django.setup() 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/__init__.py", line 20, in setup 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]  configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 46, in __getattr__ 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]  self._setup(name) 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]  self._wrapped = Settings(settings_module) 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 98, in __init__ 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]  % (self.SETTINGS_MODULE, e) 
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] ImportError: Could not import settings 'cm_central.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named cm_central.settings 
[Sun Nov 09 12:04:06 2014] [notice] Graceful restart requested, doing restart 
[Sun Nov 09 12:04:06 2014] [notice] Apache/2.2.22 (Debian) PHP/5.4.4-14+deb7u14 mod_wsgi/3.3 Python/2.7.3 configured -- resuming normal operations 
[Sun Nov 09 21:34:15 2014] [error] Not Found:/

Se una risposta potesse aiutarmi a macchio ciò che è sbagliato, sarebbe fantastico - ma ancora meglio è un n rispondi a "come eseguire il debug di questo". Come si può scoprire perché il file settings.py non viene caricato?

risposta

1

Finalmente, un answer to the high level question: how to debug?

Ed è così ovvio:

stampare tutto ciò che conta, da settings.py, e guardare nel log di Apache per guarda cosa hai, poi confrontalo con ciò che ottieni in sviluppo!

L'articolo collegato suggerisce questa serie di stampe in settings.py: sys

importazione, os

print "__name__ =", __name__ 
print "__file__ =", __file__ 
print "os.getpid() =", os.getpid() 
print "os.getcwd() =", os.getcwd() 
print "os.curdir =", os.curdir 
print "sys.path =", repr(sys.path) 
print "sys.modules.keys() =", repr(sys.modules.keys()) 
print "sys.modules.has_key('mysite') =", sys.modules.has_key('mysite') 
if sys.modules.has_key('mysite'): 
    print "sys.modules['mysite'].__name__ =", sys.modules['mysite'].__name__ 
    print "sys.modules['mysite'].__file__ =", sys.modules['mysite'].__file__ 
    print "os.environ['DJANGO_SETTINGS_MODULE'] =", os.environ.get('DJANGO_SETTINGS_MODULE', None) 

Per i miei scopi, ho anche aggiunto DATABASE_URL, e più tardi EMAIL_HOST_USER ecc

Il l'articolo ha anche una buona spiegazione di come avviene l'intero processo di avvio, che vale la pena.

Si noti che è un po 'obsoleto con Django stesso, quindi l'ultima "alternativa wsgi.py" che viene fuori può non essere applicabile, ma la tecnica di debug è certamente.

+0

Grazie per tutti i commenti che suggeriscono quale potrebbe essere il mio problema specifico - erano anche utili. – GreenAsJade

0

Si può provare ad aggiungere un file vuoto __init__.py nella directory cm_central? A seconda di come vengono importate le impostazioni, questo sarebbe necessario.

+0

Django fornisce uno di questi - è presente. – GreenAsJade

+0

Si noti che questa "risposta" fornisce un suggerimento su ciò che potrebbe essere sbagliato nel mio caso (che apprezzo davvero), ma in realtà non risponde alla domanda "come si fa a risolvere problemi come questo?". Sembra davvero che la prova e l'errore siano l'unico modo per affrontare i problemi di caricamento di wsgi, il che sembra ... subottimale? – GreenAsJade

1

potrebbero esserci motivi diversi per il problema.

autorizzazioni - forse il processo del demone wsgi è in esecuzione con un diverso utente/gruppo rispetto a quando si tenta in modo interattivo con python manage.py runserver. forse le autorizzazioni impostate sui tuoi file fanno la differenza.magari provare a usare in modo interattivo lo stesso utente del demone o viceversa. mod_wsgi ha delle belle opzioni in modo da poter eseguire i tuoi daemon sotto utenti separati, il che è positivo per la sicurezza anche a causa della separazione.

sys.path potrebbe essere diverso (anche se in qualche modo sembra corretto nella configurazione del demone), il cwd potrebbe essere diverso.

come ti sembra di utilizzare un virtualenv voi forse anche voglia di seguire le istruzioni di installazione speciali per i Mod-wsgi and Virtualenvs

+0

Sì, questi sono tutti i potenziali motivi e quindi la mia domanda "come posso eseguire il debug della situazione?". Un modo è guardare a queste cose a turno e indovinare se hanno ragione. Sto sperando in qualcosa di più "deterministico" - un modo di ottenere un messaggio di errore da qualche parte che mi dice cosa c'è che non va ... un'altra cosa che sospetto che tu non abbia menzionato è la configurazione del database, e un altro è DOCUMENT_ROOT. Tutte queste cose potrebbero essere sbagliate: come posso convincere django o apache a emettere un messaggio migliore per eseguirne il debug? – GreenAsJade

+0

(Nota: i django docs avevano qualche consiglio su virtualenv, ma ho bisogno di controllare anche la pagina che hai collegato - grazie, lo farà) – GreenAsJade

1

Si potrebbe provare ad aggiungere questo alla tua wsgi.py:

path = os.path.join(os.path.dirname(__file__), "..") # Adapt the path here to match the root of your django project 
if path not in sys.path: 
    sys.path.append(path) 

per garantire che il progetto Django è nel percorso Python?

If an answer could help me spot what's wrong, that'd be great - but even better is an answer to "how to debug this". How does one find out why the settings.py won't load?

È difficile rispondere a questa domanda se non sappiamo esattamente quello che hai già provato. Sulla base del traceback (Is it on sys.path? Is there an import error in the settings file?), direi:

  • Verificare che la cartella di base del progetto Django è nel percorso pitone (che non ho letto che ho fatto, è per questo che ho fatto il suggerimento sopra)

  • Controllare che non ci siano exeptions sollevate quando si carica il tuo settings.py file (che avete già fatto)

+0

Grazie per questi suggerimenti, li proverò. Quello che sto davvero cercando, però (quale sia la domanda che ci chiediamo) noi "come faccio a ottenere un messaggio di errore migliore di" impossibile importare settings.py "?". Come faccio a farmi dire qualcosa, perché non potrebbe importarlo? Se potessimo rispondere a questa domanda, verrebbero risolte delle risme di domande simili! – GreenAsJade

1

primo luogo, per la vera questione qui. Come ottenere maggiori informazioni su cosa esattamente sta fallendo? Potrei sbagliarmi, ma sono quasi sicuro che non ci siano strumenti/pacchetti/log o qualsiasi altra cosa che potrebbe darti più informazioni sul problema rispetto a quello che hai già ottenuto: il traceback. Quindi credo che l'unico modo di debug di questi errori, è il metodo "traceback" ;-)

--- Ora per il problema:

Forse è un problema di permessi. Nel tuo WSGIDaemonProcess non si specifica alcun utente o gruppo, e forse apache non è autorizzato a leggere/eseguire i file. Si può provare ad aggiungere utenti e gruppi a questa linea come questa:

WSGIDaemonProcess cm-central.johalla.de user=<username> group=<username> python-path=/home/cmc/src/cm_central:/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages 

Inoltre, non si sta usando un DocumentRoot. Forse è per questo che non sta trovando la strada giusta? Nei miei vhost, ho sempre includere un DocumentRoot, che ha lo stesso percorso della directory, ma con una barra che porta, nel tuo caso:

<VirtualHost *:80> 
    DocumentRoot /home/cmc/src/cm_central/cm_central/ 

Così forse che risolve il problema.

1

Il messaggio di errore è abbastanza esplicito già - mod_wsgi non riesce a trovare il file delle impostazioni (linea 2, os.environ.setdefault), controllare il percorso di sistema (capisco che Django può trovare il file di impostazioni quando si utilizza runserver, ma mod_wsgi non posso). Per controllare il vostro percorso di sistema, è possibile modificare il file wsgi.py e stampare/log il sys.path al vertice del file:

import sys 
print sys.path 

Oltre ai documenti env virtuali puntato da @Thomas Waldmann, si può anche è necessario aggiungere manualmente la directory del progetto in sys.path, come indicato in here in the Django config docs.Esempio di codice che uso è qui sotto:

ALLDIRS = ['/usr/local/pythonenv/assessments/lib/python2.6/site-packages'] 

import os 
import sys 
import site 

# from https://code.google.com/p/modwsgi/wiki/VirtualEnvironments 

sys.path.insert(0, '/var/www/assessments/assessments-main/') # settings.py file here 
sys.path.insert(1, '/var/www/assessments/') 

prev_sys_path = list(sys.path) 
for directory in ALLDIRS: 
    site.addsitedir(directory) 

new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
     new_sys_path.append(item) 
     sys.path.remove(item) 

sys.path[:0] = new_sys_path 

os.environ['DJANGO_SETTINGS_MODULE'] = 'assessments-main.settings' 

import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 
+0

"Il messaggio di errore è già abbastanza esplicito - mod_wsgi non riesce a trovare il file delle impostazioni" Non ne sono sicuro. Si noti che i messaggi di errore richiedono "esiste un errore durante l'importazione di settings.py?". Prendo questo per significare che _either_ non riesce a trovarlo _ o_ c'è qualcosa di sbagliato al suo interno! Inoltre, i consigli che le persone danno per eseguire il debug di questo problema è quello di verificare se Python può importare il file delle impostazioni, il che implica che potrebbe esserlo. Era più esplicito che il problema è precisamente che non può trovarlo, sarebbe più utile. Sei sicuro che si tratti solo di trovarlo? – GreenAsJade

+0

Infatti, non dice "Impossibile trovare" dice "impossibile importare". Questo potrebbe essere perché non riesce a trovarlo o perché non riesce a importarlo, abbastanza chiaramente. Il che significa che il problema può essere lungo e ampio: autorizzazioni per l'accesso, percorsi in wsgi.py, o qualsiasi numero di ragioni per cui Apache non può importarlo mentre runserver può. Da qui la necessità di un modo per eseguire il debug di cosa sta andando male :) – GreenAsJade

+0

Grazie per il puntatore a IntegrationWithDjango, non posso credere di non averlo visto prima! – GreenAsJade

Problemi correlati