2013-02-17 12 views
27

Próbuję opublikować moją witrynę na instancji EC2 Amazona i ciągle otrzymuję błąd 500. Naprawdę nie wiem dlaczego.ImportError: Brak modułu o nazwie django.core.wsgi Apache + VirtualEnv + AWS + WSGI

// Log Files

[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 

// Apache Config Files

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) 

Odpowiedz

7

Dodaj to do pliku konfiguracyjnego Apache:

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

Nie rade .... jednak zrobiłem „LDD mod_wsgi.so” i wskazuje na Python 2.6, ale moim wirtualnym środowiskiem jest Python 2.7 ... – abisson

+4

Ah, w takim przypadku zobacz [tę odpowiedź] (http://stackoverflow.com/a/8662381/1428653). – Matt

27

Wiem, że to stary wątek, ale właśnie wpadłem na ten sam problem i nie sądzę, że jest to spowodowane brakującym pakietem. Ponieważ dystrybucja jądra Django zawiera już prawidłowy program obsługi wsgs.

Problem polega na tym, że po uruchomieniu pliku wsgi.py brakuje pakietów pakietów witryny z virtualenv. (Jeśli aktywowałeś virtualenv, i wykonałeś instalację pip django, wszystko jest w porządku, masz niezbędne pakiety django).

Jeśli chodzi o mnie, naprawiłem problem modyfikujący sys.path w moim pliku Path/to/Project/Project/wsgi.py.

Musisz dodać katalog projektu i pakiety virtualenv-site do listy sys.path. Oto mój plik wsgi.py zawarty w moim projekcie (Mówiąc o pliku wsgi.py utworzonym za pomocą projektu startowego django-admin.py) ... który musiałem zmodyfikować, aby działał z 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 
# =================== 

Upewnij:

  1. dodano mod_wsgi do Apache moduły reż mod_wsgi musi być skompilowane dla systemu operacyjnego, wersja Apache i Python masz

  2. dodano moduł polecenie obciążenia do swojej httpd. conf do loa d moduł mod_wsgi moduły LoadModule wsgi_module/mod_wsgi.so

  3. skonfigurowane specyfika Django twojej httpd.conf lub konf uwzględnić w httpd.conf

na podstawie dokumentacji 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> 

Mam nadzieję, że to pomoże. To zadziałało dla mnie.

+1

Aktualizacja ** wsgi.py ** wydaje mi się to naprawić, z tym że moje 'site-packages' miały inną ścieżkę (a nie wielką literę L w lib):' lib/python3.6/site-packages '. Twoja ścieżka może być inna, fx. jeśli masz inną wersję pythona, sugeruję to sprawdzić. Również nie jestem pewien, co oznacza 'PATH_TO_PROJECT/hellodjango'. Czy powinien to być katalog, w którym znajduje się ** settings.py **? – miyalys

3

Dla mnie ten wskazany Django nie został zainstalowany na serwerze. Naprawiono przez:

pip install Django 
+2

To pokonuje cel użycia virtualenv. – kjyv

+0

Często nie jest to takie proste: Rozważ przykład udostępnionego dev lub serwera pomostowego, w którym wiele gałęzi projektu django musi być uruchomionych na różnych wirtualnych hostach - z których każdy działa dobrze w środowisku wirtualnym. – fiacre

+0

Gdyby ten sam problem na Amazon ec2, zainstalował Django pod nazwą użytkownika Ubuntu, ale musiał być zainstalowany pod rootem, aby Apache2 mógł go odebrać z jakiegoś powodu. –

0

Skonfigurowałeś wszystko bardzo dobrze, mój przyjacielu, wystarczy dać użytkownikowi Apache pozwolenie na dostęp do katalogów projektu i virtualenv.

Przykład:

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

to rozwiązać mój problem z ImportError: No module named django.core.wsgi (virtualenvs folderów) i ImportError: No module named <project-name>.settings (projekty katalogów)

-1

Dla mnie to było pewne zmienne, które musiały być setted (dla Windows):

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

Upewnij się, że korzystasz z modułu uwsgi zainstalowanego w virtualenv, na przykład:

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

Miałem podobny błąd właśnie teraz. Okazuje się, że nasz kod Django został opracowany na pythona 3.5, ale z pewnych powodów ludzie, którzy wdrożyli nasz serwer, konfigurują virtualEnv z pythonem 2.7. Mamy Przesunięcia z Pythona 3.5 i wszystko działało dla nas

Poniżej był komunikat o błędzie, które otrzymałem:

$ 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 

nadzieję, że pomoże ktoś z widząc podobny komunikat o błędzie!

0

na pierwszy rzut oka jestem przepraszam za mój angielski. I również w obliczu tego problemu, a ja go rozwiązać poprzez zmianę „wsgi.py” plik:

 
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()