2015-02-16 17 views
5

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?

+0

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? –

+0

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

+0

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

Trả lời

3

Với gợi ý từ Graham Dumpleton qua nhóm google mod_wsgi, một giải pháp đã được tìm thấy. Vấn đề cốt lõi là phiên bản mod_wsgi được cài đặt bởi cả hai brew install mod_wsgipip install mod_wsgi đều được biên dịch cho Python 2.7.x.

Một điều khác. pip, trên hệ thống trong đó python --version trả về Python 2.7.6, sẽ sử dụng phiên bản Python đó để tạo bất kỳ lệnh cài đặt nào. Nếu bạn có Python 3.x, cùng với 2.7.x và python --version trả lại Python 3.x.x, pip3 install ... sẽ tải xuống mã tương thích 3.x và xây dựng cho phiên bản Python đó.

Giải pháp là để loại bỏ tất cả cài đặt qua

brew uninstall mod_wsgi 
pip uninstall mod_wsgi 

và cài đặt thông qua

pip3 install mod_wsgi 

Kết quả là, vị trí LoadModule cho các tập tin cấu hình Apache đã được đổi thành

/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 

Lưu ý vị trí python3.4 trong đường dẫn.

Sau khi thực hiện các thay đổi này và khởi động lại Apache, trang web tải như mong đợi.

+0

Đây là một đoạn kiến ​​thức tốt - cảm ơn. Chắc chắn có giá trị +1. – nicorellius

Các vấn đề liên quan