2013-02-17 10 views
27

Sto tentando di pubblicare il mio sito su un'istanza EC2 di Amazon e continuo a ricevere un errore 500. Davvero non so perché.ImportError: nessun modulo denominato django.core.wsgi Apache + VirtualEnv + AWS + WSGI

// File di log

[Sun Feb 17 23:12:48.066802 2013] mod_wsgi (pid=2102): Target WSGI script '/srv/www/app/poka/apache/wsgi.py' cannot be loaded as Python module. 
    [Sun Feb 17 23:12:48.066840 2013] mod_wsgi (pid=2102): Exception occurred processing WSGI script '/srv/www/app/poka/apache/wsgi.py'. 
    [Sun Feb 17 23:12:48.066864 2013] Traceback (most recent call last): 
    [Sun Feb 17 23:12:48.066889 2013] File "/srv/www/mysite/poka/apache/wsgi.py", line 26, in <module> 
    [Sun Feb 17 23:12:48.066920 2013] from django.core.wsgi import get_wsgi_application 
    [Sun Feb 17 23:12:48.066945 2013] ImportError: No module named django.core.wsgi 

// File di configurazione di Apache

WSGIScriptAlias//srv/www/app/mysite/apache/wsgi.py 

    WSGIDaemonProcess mysite python-path=/srv/www/app/mysite:/home/ec2-user/.virtualenvs/mysite-main/lib/python2.7/site-packages 
    WSGIProcessGroup mysite 

    <Directory /srv/www/app/mysite/apache/> 
    <Files wsgi.py> 
    Order deny,allow 
    Allow from all 
    </Files> 
    </Directory> 

    <Directory /srv/www/app/mysite/apache/> 
    Order deny,allow 
    Allow from all 
    </Directory> 

    <Directory /home/ec2-user/app/mysite/static> 
    Order deny,allow 
    Allow from all 
    </Directory> 

    <Directory /home/ec2-user/app/mysite/media> 
    Order deny,allow 
    Allow from all 
    </Directory> 

//wsgi.py

import os 
    import sys 
    import site 

    site.addsitedir('/home/ec2-user/.virtualenvs/mysite-main/lib/python2.7/site-packages') 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") 

    from django.core.wsgi import get_wsgi_application 
    application = get_wsgi_application() 

    path = '/srv/www/app/mysite' 

    if path not in sys.path: 
     sys.path.append(path) 

risposta

7

Aggiungere questo al file di configurazione di Apache:

WSGIPythonHome /home/ec2-user/.virtualenvs/mysite-main 
+0

Non ha fatto il trucco .... però ho fatto un "ldd mod_wsgi.so" e punta a Python 2.6, ma il mio ambiente virtuale è Python 2.7 ... – abisson

+4

Ah, in tal caso, vedere [questa risposta] (http://stackoverflow.com/a/8662381/1428653). – Matt

27

So che questo è un thread vecchio, ma mi sono appena imbattuto nello stesso problema e non penso che questo sia causato da un pacchetto mancante. Poiché la distribuzione core di Django contiene già il gestore wsgi corretto.

Il problema qui è che quando wsgi.py viene eseguito mancano i pacchetti dei pacchetti del sito dal tuo virtualenv. (Se hai attivato il tuo virtualenv, e hai fatto installare django, allora tutto va bene, hai i pacchetti django necessari).

Per quanto mi riguarda, ho risolto il problema modificando sys.path nel mio file Path/to/Project/Project/wsgi.py.

È necessario aggiungere la directory del progetto ei pacchetti del sito virtualenv all'elenco sys.path. Ecco il mio file wsgi.py contenuto nel mio progetto (Parlando di wsgi.py creato con django-admin.py start-project) ... che ho dovuto modificare per farlo funzionare con Apache

# ===================== 
# wsgi.py file begin 

import os, sys 
# add the hellodjango project path into the sys.path 
sys.path.append('<PATH_TO_MY_DJANGO_PROJECT>/hellodjango') 

# add the virtualenv site-packages path to the sys.path 
sys.path.append('<PATH_TO_VIRTUALENV>/Lib/site-packages') 

# poiting to the project settings 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hellodjango.settings") 

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

# wsgi.py file end 
# =================== 

assicurarsi:

  1. si è aggiunto mod_wsgi alla Apache moduli dir mod_wsgi deve essere compilato per il sistema operativo, Apache e Python versione che ha

  2. aggiunto il comando modulo di carico nel vostro httpd. conf to loa modulo mod_wsgi d LoadModule wsgi_module/mod_wsgi.so

  3. specifiche configurate Django nel vostro httpd.conf o qualsiasi conf è includere nel vostro httpd.conf

Sulla base della documentazione How to use Django with Apache and mod_wsgi

WSGIScriptAlias/<PATH_TO_PROJECT>/hellodjango/hellodjango/wsgi.py 
WSGIPythonPath <PATH_TO_PROJECT>:<PATH_TO_VIRTUALENV>/Lib/site-packages 

<Directory <PATH_TO_PROJECT>/hellodjango/hellodjango> 
    <Files wsgi.py> 
    Order deny,allow 
    Require all granted 
    </Files> 
</Directory> 

Spero che questo aiuti. Ha funzionato per me.

+1

L'aggiornamento ** wsgi.py ** sembra aggiustarlo per me, tranne che il mio 'site-packages' aveva un percorso diverso (e non con una L maiuscola in lib):' lib/python3.6/site-packages '. Il tuo percorso potrebbe essere diverso, fx. se hai una versione Python diversa, ti suggerisco di controllarla. Inoltre non sono sicuro di cosa significhi 'PATH_TO_PROJECT/hellodjango'. Dovrebbe essere la directory in cui ** settings.py ** è? – miyalys

3

Per me, questo indica che Django non è stato installato sul sever. Risolto via

pip install Django 
+2

Ciò vanifica lo scopo dell'utilizzo di virtualenv. – kjyv

+0

Spesso non è così semplice: si consideri l'esempio di un server di sviluppo condiviso o di staging in cui più rami di un progetto django devono essere eseguiti su vari host virtuali, ognuno dei quali funziona bene in un ambiente virtuale. – fiacre

+0

Se lo stesso problema fosse avvenuto su Amazon ec2, avevate installato Django sotto il nome utente di Ubuntu, ma era necessario installarlo sotto root affinché Apache2 lo prelevasse per qualche motivo. –

0

Hai configurato tutto molto bene il mio amico, solo bisogno di dare il permesso all'utente apache per accedere sia progetto e virtualenv dirs.

Esempio:

sudo chown -R www-data:www-data /home/ubuntu/projects 
sudo chown -R www-data:www-data /home/ubuntu/virtualenv 

Ciò ha risolto il mio problema con ImportError: No module named django.core.wsgi (virtualenvs cartelle) e ImportError: No module named <project-name>.settings (progetti cartelle)

-1

Per me è stato alcune variabili che dovevano essere impostato (per Windows):

set PYTHONHOME=F:\path\to\python 
set PYTHONPATH=F:\path\to\python 
-1

Assicurarsi di utilizzare il modulo uwsgi installato all'interno del virtualenv, ad esempio:

/home/ubuntu/venv/bin/uwsgi --ht :8000 --module mysite.wsgi 
0

Ho avuto un errore simile proprio ora. Si scopre che il nostro codice Django è stato sviluppato su python 3.5, ma per alcune ragioni le persone che hanno implementato il nostro server virtualEnv con python 2.7. Abbiamo reimpiegato con Python 3.5 e tutto ha funzionato per noi

Di seguito è stato il messaggio di errore che ho ricevuto:

$ python serviceStartup.py 
Traceback (most recent call last): 
    File "serviceStartup.py", line 10, in <module> 
    from django.core.wsgi import get_wsgi_application 
ImportError: No module named django.core.wsgi 

Spero che questo vi aiuterà con chiunque di vedere un messaggio di errore simile!

0

A prima vista, mi dispiace per il mio inglese. Ho anche affrontato questo problema, e ho risolto modificando file 'wsgi.py' a:

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


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "eisentask.settings.production") 
django.setup(set_prefix=False) 

application = WSGIHandler() 
Problemi correlati