Tôi đang cố định cấu hình ứng dụng thử nghiệm Django cho một dự án cá nhân. Tôi có kinh nghiệm Django trước đó, nhưng đó là tất cả với Python 2.7.x. Tôi muốn bắt đầu sử dụng 3.x khi có thể, và dự án này có vẻ như là một cách tốt để bắt đầu.Django, Python 3 & Postgres - mod_wsgi issue
Phụ trợ là bản cài đặt chuẩn Postgres 9.4, Apache 2.4, Python 3.4 trong virtualenvwrapper, hệ điều hành là OSX 10.10. mod_wsgi và mod_wsgi3 đều đã được cài đặt qua homebrew
.
Tuy nhiên, có những vấn đề nhận được mod_wsgi và mod_wsgi3 để làm việc với python 3. Cụ thể, ./manage.py runserver 8080
hoạt động tốt, nhưng khi tôi cố gắng sử dụng một cấu hình VirtualHost với Apache, tôi nhận được
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
wsgi.py My tập tin là
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()
và tập tin virtualhost là:
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>
Vấn đề của tôi là nếu tôi có một con trăn 2,7 virtualenv với virtualhost cùng với LoadModule
trỏ đến
LoadModule wsgi_module /usr/local/Cellar/mod_wsgi/4.4.7/libexec/mod_wsgi.so
và thay thế
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"))
trong wsgi.py với
exec(open("/Users/jasonjohns/.virtualenvs/geocode_env/bin/activate_this.py").read())
tôi có thể tải lên trang web với URL dev.geocode.com
. Nếu không, tôi sẽ gặp lỗi 500 trang với đầu ra lỗi trong tệp nhật ký.
Tôi nghĩ đây là vấn đề với psycopg2 và đã nộp bug report. Tuy nhiên, dev đã đóng vấn đề như đang được quan tâm với mod_wsgi, không phải psycopg.
Tóm tắt biên dịch mod_wsgi cho môi trường địa phương của tôi, có cách nào để khắc phục sự cố này không?
Nhưng lỗi là cho psycopg, không phải mod_wsgi. Bạn có chắc là bạn đã cài đặt đúng cho Python 3 không? –
Tôi ban đầu nghĩ rằng, và nộp một báo cáo lỗi tại https://github.com/psycopg/psycopg2/issues/286#issuecomment-73619287. Tuy nhiên, psycopg dev tin rằng nguyên nhân là do các yếu tố bên ngoài, không phải với psycopg. Tôi đã thêm điều này và liên kết báo cáo lỗi cho câu hỏi. – Jason
Ngoài ra, nó là một vấn đề psycopg, sau đó tôi vẫn sẽ nhận được cùng một lỗi thông qua chạy './manage.py runserver 8080'. Kể từ khi máy chủ django dev hoạt động, và sử dụng một Python 2.7.x thực thi công trình với Apache, có vẻ như vấn đề là mod_wsgi tương thích với python 3.x – Jason