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?
Ale błąd dotyczy psycopg, a nie mod_wsgi. Czy na pewno zainstalowałeś to poprawnie dla Pythona 3? –
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
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