2015-02-16 16 views
5

Próbuję skonfigurować aplikację testową Django dla osobistego projektu. Mam wcześniejsze doświadczenie Django, ale to wszystko z Pythonem 2.7.x. Chciałbym zacząć używać 3.x, kiedy to możliwe, a ten projekt wydaje się być dobrym sposobem na rozpoczęcie.Django, Python 3 i Postgres - mod_wsgi numer

Backend to standardowa instalacja Postgrena 9.4, Apache 2.4, Python 3.4 w virtualenvwrapper, system operacyjny to OS X 10.10. Mod_wsgi i mod_wsgi3 zostały zainstalowane przez homebrew.

Jednakże istnieją problemy coraz mod_wsgi i mod_wsgi3 pracować z Pythona 3. Konkretnie, ./manage.py runserver 8080 działa poprawnie, ale gdy próbuję użyć konfiguracji VirtualHost z Apache, mam

mod_wsgi (pid=29906): Target WSGI script '/Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py' cannot be loaded as Python module. 
mod_wsgi (pid=29906): Exception occurred processing WSGI script '/Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py'. 
Traceback (most recent call last): 
    File "/Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py", line 28, in <module> 
    application = get_wsgi_application() 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/core/wsgi.py", line 14, in  get_wsgi_application 
     django.setup() 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/__init__.py", line 21, in setup 
     apps.populate(settings.INSTALLED_APPS) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/apps/config.py", line 197, in import_models 
     self.models_module = import_module(models_module_name) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
     __import__(name) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/contrib/auth/models.py", line 40, in <module> 
     class Permission(models.Model): 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/models/base.py", line 125, in __new__ 
     new_class.add_to_class('_meta', Options(meta, **kwargs)) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/models/base.py", line 300, in add_to_class 
     value.contribute_to_class(cls, name) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/models/options.py", line 166, in contribute_to_class 
     self.db_table = truncate_name(self.db_table, connection.ops.max_name_length()) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/__init__.py", line 40, in __getattr__ 
     return getattr(connections[DEFAULT_DB_ALIAS], item) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/utils.py", line 242, in __getitem__ 
     backend = load_backend(db['ENGINE']) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/utils.py", line 108, in load_backend 
     return import_module('%s.base' % backend_name) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
     __import__(name) 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/contrib/gis/db/backends/postgis/base.py", line 2, in <module> 
     from django.db.backends.postgresql_psycopg2.base import DatabaseWrapper as Psycopg2DatabaseWrapper 
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 27, in <module> 
     raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e) 
      ImproperlyConfigured: Error loading psycopg2 module: dlopen(/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/ site-packages/psycopg2/_psycopg.so, 2): Symbol not found: _PyBytes_Type 
     Referenced from: /Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/psycopg2/_psycopg.so 
      Expected in: flat namespace 
      in /Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/psycopg2/_psycopg.so 

Moje wsgi.py plik jest

import os, sys, site 

site.addsitedir("/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages") 

sys.path.append("/Users/jason/projects/geocode_django/geodjango") 
sys.path.append("/Users/jason/projects/geocode_django/geodjango/geodjango") 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "geodjango.settings") 

with open("/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py") as f: 
    code = compile(f.read(), "/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py", "exec") 
    exec(code, dict(__file__="/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py")) 

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

i virtualhost plik jest:

LoadModule wsgi_module /usr/local/Cellar/mod_wsgi3/3.5/libexec/mod_wsgi.so 

<VirtualHost *:80> 
    ServerName  dev.geocode.com 
    ServerAlias  geocode.com 
    ServerAdmin  [email protected] 

    DocumentRoot "/Users/jason/projects/geocode_django" 
    Alias /static/ /Users/jason/projects/geocode_django/static/ 

    WSGIScriptAlias//Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py 

    <Directory /Users/jason/projects/geocode_django/static > 
      require all granted 
    </Directory> 

    <Directory /Users/jason/projects/geocode_django/geodjango/geodjango > 
      <Files wsgi.py > 
        Require all granted 
      </Files> 

    </Directory> 

    CustomLog /Users/jason/projects/geocode_django/logs/access.log combined 
    ErrorLog /Users/jason/projects/geocode_django/logs/error.log 

</VirtualHost> 

Mój problem jest to, że jeśli mam Python 2.7 virtualenv z tego samego wirtualnego hosta z LoadModule skierowaną

LoadModule wsgi_module /usr/local/Cellar/mod_wsgi/4.4.7/libexec/mod_wsgi.so 

i zastąpić

with open("/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py") as f: 
    code = compile(f.read(), "/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py", "exec") 
    exec(code, dict(__file__="/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py")) 

w wsgi.py z

exec(open("/Users/jasonjohns/.virtualenvs/geocode_env/bin/activate_this.py").read()) 

I można załadować stronę z adresem URL dev.geocode.com. W przeciwnym razie pojawia się błąd o wielkości 500 stron z wynikiem błędu w pliku dziennika.

Początkowo sądziłem, że to był problem z psycopg2, i złożyłem bug report. Jednak dev zamknął sprawę, ponieważ dotyczył mod_wsgi, a nie psycopg.

Skrót od kompilowania mod_wsgi dla mojego lokalnego środowiska, czy istnieje sposób na naprawienie tego problemu?

+0

Ale błąd dotyczy psycopg, a nie mod_wsgi. Czy na pewno zainstalowałeś to poprawnie dla Pythona 3? –

+0

Początkowo myślałem, że i złożył raport o błędzie na https://github.com/psycopg/psycopg2/issues/286#issuecomment-73619287. Jednak program psycopg dev uważa, że ​​przyczyną są czynniki zewnętrzne, a nie psycopg. Dodałem ten link i link do zgłoszenia błędu do pytania. – Jason

+0

Ponadto, był to problem z psycopg, to nadal otrzymywałbym ten sam błąd, uruchamiając './manage.py runserver 8080'. Ponieważ serwer Django działa, a użycie pliku wykonywalnego Pythona 2.7.x działa z Apache, wydaje się, że problemem jest kompatybilność mod_wsgi z pythonem 3.x – Jason

Odpowiedz

3

Z podpowiedzią Grahama Dumpletona za pośrednictwem grupy go_wsgi google, znaleziono rozwiązanie. Głównym problemem było to, że wersja mod_wsgi zainstalowana zarówno przez brew install mod_wsgi i pip install mod_wsgi zostały skompilowane dla Python 2.7.x.

Kolejna sprawa. pip, w systemie, w którym python --version zwraca Python 2.7.6, będzie używać tej wersji Pythona do budowania dowolnych poleceń instalacji. Jeśli masz Python 3.x, wraz z 2.7.x i python --version zwraca Python 3.x.x, pip3 install ... pobierze 3.x kompatybilny kod i skompiluje dla tej wersji Pythona.

Rozwiązaniem było usunąć obie instalacje poprzez

brew uninstall mod_wsgi 
pip uninstall mod_wsgi 

i zainstalować poprzez

pip3 install mod_wsgi 

W rezultacie, lokalizacja LoadModule do pliku konfiguracyjnego Apache została zmieniona na

/usr/local/lib/python3.4/site-packages/mod_wsgi-4.4.9-py3.4-macosx-10.10-x86_64.egg/mod_wsgi/server/mod_wsgi-py34.so 

Zwróć uwagę na lokalizację python3.4 w ścieżce.

Po wprowadzeniu tych zmian i ponownym uruchomieniu Apache, strona ładuje się zgodnie z oczekiwaniami.

+0

To jest dobra porcja wiedzy - dzięki. Zdecydowanie warte +1. – nicorellius