Развертывание Django WSGI. Нет модуля с именем «_sqlite3»

Я пытаюсь развернуть приложение Django под Django 1.8 и Apache mod_wsgi (python 3.4.3, ubuntu 14.04)

Я решил предыдущую ошибку с помощью импорта ( Django WSGI deployment. import name 'SimpleCookie' ), но потом я встречаю еще одно:

Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named '_sqlite3'

Вот большая часть журнала ошибок:

[Wed Jun 10 18:33:44.021939 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 1448, in exec_module
[Wed Jun 10 18:33:44.021960 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
[Wed Jun 10 18:33:44.022198 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/contrib/auth/models.py", line 41, in <module>
[Wed Jun 10 18:33:44.022207 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     class Permission(models.Model):
[Wed Jun 10 18:33:44.022760 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/db/models/base.py", line 139, in __new__
[Wed Jun 10 18:33:44.022770 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     new_class.add_to_class('_meta', Options(meta, **kwargs))
[Wed Jun 10 18:33:44.022807 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/db/models/base.py", line 324, in add_to_class
[Wed Jun 10 18:33:44.022814 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     value.contribute_to_class(cls, name)
[Wed Jun 10 18:33:44.023151 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/db/models/options.py", line 250, in contribute_to_class
[Wed Jun 10 18:33:44.023161 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
[Wed Jun 10 18:33:44.023296 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/db/__init__.py", line 36, in __getattr__
[Wed Jun 10 18:33:44.023304 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     return getattr(connections[DEFAULT_DB_ALIAS], item)
[Wed Jun 10 18:33:44.023514 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/db/utils.py", line 240, in __getitem__
[Wed Jun 10 18:33:44.023558 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     backend = load_backend(db['ENGINE'])
[Wed Jun 10 18:33:44.023603 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/db/utils.py", line 111, in load_backend
[Wed Jun 10 18:33:44.023610 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     return import_module('%s.base' % backend_name)
[Wed Jun 10 18:33:44.023642 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/usr/local/lib/python3.4/importlib/__init__.py", line 109, in import_module
[Wed Jun 10 18:33:44.023649 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     return _bootstrap._gcd_import(name[level:], package, level)
[Wed Jun 10 18:33:44.023669 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 2231, in _gcd_import
[Wed Jun 10 18:33:44.023690 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
[Wed Jun 10 18:33:44.023711 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 2203, in _find_and_load_unlocked
[Wed Jun 10 18:33:44.023732 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
[Wed Jun 10 18:33:44.023752 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 1129, in _exec
[Wed Jun 10 18:33:44.023773 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 1448, in exec_module
[Wed Jun 10 18:33:44.023793 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
[Wed Jun 10 18:33:44.023826 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]   File "/var/www/.virtualenvs/cp/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 36, in <module>
[Wed Jun 10 18:33:44.023833 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780]     raise ImproperlyConfigured("Error loading either pysqlite2 or sqlite3 modules (tried in that order): %s" % exc)
[Wed Jun 10 18:33:44.023862 2015] [:error] [pid 19282:tid 140071189554944] [client 192.168.1.1:16780] django.core.exceptions.ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named '_sqlite3'

При запуске сервера разработки ошибок не возникает. Также нет ошибок при работе в интерпретаторе python в virtualenv cp.

>>>import sqlite3

Мой файл wsgi.py:

import os, sys, site

sys.path.insert(0,'/var/www/.virtualenvs/cp/lib/python3.4/site-packages')
sys.path.insert(0,'/var/www/django_projects/cp')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

exec(open("/var/www/.virtualenvs/cp/bin/activate_this.py").read())

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

Вот конфигурация виртуального хоста Apache для сайта:

<VirtualHost *:80>
    ServerName cp.mysite.com
    WSGIDaemonProcess cp user=www-data group=www-data threads=5
    WSGIApplicationGroup cp
    WSGIScriptAlias / /var/www/django_projects/cp/mysite/wsgi.py

    <Directory /var/www/django_projects/cp/mysite>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    ErrorLog    /var/www/errlogs/cperror.log
</VirtualHost>

person Leo    schedule 10.06.2015    source источник
comment
Вы делаете это не лучшим образом. Вставка чего-либо в sys.path является антипаттерном. Так же как и выполнение скрипта с exec(). Вы можете создать скрипт (bash или любой другой), чтобы подготовить среду для запуска сервера. Активируйте venv и настройте модуль настроек в этом файле. Могу привести пример, если хотите.   -  person sobolevn    schedule 10.06.2015
comment
Я буду признателен за это. Я использую то, что вижу в других примерах, и мне очень странно, что этот конкретный сайт не запускается.   -  person Leo    schedule 10.06.2015
comment
Я сделал суть для вас. Обратите внимание, что я не bash эксперт. gist.github.com/sobolevn/c99122979654522d4dca   -  person sobolevn    schedule 10.06.2015
comment
Спасибо :) Это я проверю.   -  person Leo    schedule 10.06.2015
comment
Я предполагаю, что вы используете версию mod_wsgi, скомпилированную для Python 2, но запускаете ее для Python 3.   -  person Daniel Roseman    schedule 10.06.2015
comment
У меня этот пробем недавно, но потом установил правильный mod_wsgi (libapache2-mod-wsgi-py3 под ubuntu)   -  person Leo    schedule 10.06.2015
comment
@sobolevn То, что вы предлагаете, на самом деле здесь не сработает, поскольку mod_wsgi работает путем встраивания Python в Apache, а затем Apache запускается с правами root из сценариев запуска системы. Хотя технически вы можете изменить сценарии запуска системы, чтобы они попытались активировать виртуальную среду Python, это представляет угрозу безопасности, поскольку это нужно будет делать от имени пользователя root, что открывает возможности для выполнения кода root, если кто-то будет возиться с виртуальная среда.   -  person Graham Dumpleton    schedule 11.06.2015
comment
Хотя есть и лучшие способы, чем обновление sys.path, это не анти-шаблон, как вы могли бы предположить, и это один из множества допустимых методов, которые вы бы использовали здесь. Точно так же использование exec() не является проблемой, хотя вместо того, чтобы читать содержимое файла и использовать exec(), документация virtualenv говорит использовать execfile() непосредственно в имени файла.   -  person Graham Dumpleton    schedule 11.06.2015
comment
Тем не менее, предпочтительным способом является использование параметров python-home и python-path в директиве WSGIDaemonProcess. См. blog.dscpl.com.au/2014. /09/ и blog.dscpl.com.au/2014/09/ В этом случае я согласен с @DanielRoseman в том, что mod_wsgi, вероятно, скомпилирован для версии Python, отличной от виртуальной среды. Вы не можете смешивать их.   -  person Graham Dumpleton    schedule 11.06.2015
comment
@GrahamDumpleton, спасибо, я посмотрю на это.   -  person sobolevn    schedule 11.06.2015
comment
@GrahamDumpleton, я использую exec вместо execfile, поскольку последний был удален из Python 3.X. Я дважды проверил, что libapache2-mod-wsgi не установлен в моей системе — только libapache2-mod-wsgi-py3, предназначенный для Python 3.   -  person Leo    schedule 11.06.2015
comment
Вы уверены, что libapache2-mod-wsgi-py не для Python 3.3. Проверьте, попробовав: code.google.com/p/modwsgi/wiki/ code.google.com/p/modwsgi/wiki/   -  person Graham Dumpleton    schedule 11.06.2015
comment
@GrahamDumpleton, ответ сервера (ваша вторая ссылка) sys.version = '3.4.0 ...... Так что это пользовательская система Python3 по умолчанию. в то время как в virtualenv cp я использую 3.4.3   -  person Leo    schedule 11.06.2015
comment
Я проверил полученный sys.pah: ['/var/www/django_projects/cp', '/var/www/.virtualenvs/cp/lib/python3.4/site-packages', '/usr/local/lib /python3.4', '/usr/local/lib/python3.4/plat-x86_64-linux-gnu', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/ lib/python3.4/site-packages'] Он включает в себя папки из моего virtualenv, а также из python3 systmem. Это правильно?   -  person Leo    schedule 11.06.2015
comment
Если у вас есть отдельная установка Python 3.4.3 в /usr/local, которая отличается от системного Python, вам придется пересобрать mod_wsgi для нее. Вполне вероятно, что установка Python 3.4.3 не была настроена с совместимым набором параметров времени сборки, поэтому смешивание таких установок не сработает. В общем, смешивать разные инсталляции — плохая идея. Обратите внимание на эту первую ссылку и убедитесь, что ldd показывает правильную выбранную библиотеку Python. Если нет, используйте LD_RUN_PATH во время компиляции, чтобы определить, где он находится, как объяснено.   -  person Graham Dumpleton    schedule 11.06.2015


Ответы (1)


Наконец, после отладки с помощью простого wsgi.py (спасибо @GrahamDumpleton за link), я обнаружил, что полученный sys.path не слишком чист.

Поэтому я вручную изменил sys.path в wsgi.py, взяв его из python, запущенного в virtualenv cp, а затем добавил каталог проекта в этот список в начале wsgi.py:

import os, sys

virtual_env = '/var/www/.virtualenvs/cp'    
sys.path=['%s/lib/python34.zip' % (virtual_env,), 
          '%s/lib/python3.4' % (virtual_env,), 
          '%s/lib/python3.4/plat-linux' % (virtual_env,), 
          '%s/lib/python3.4/lib-dynload' % (virtual_env,), 
          '%s/lib/python3.4/site-packages' % (virtual_env,),
          #'/var/www/python/3.4.3/lib/python3.4', 

          ]
sys.path.insert(0,'/var/www/django_projects/cp')

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

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

Возможно, это не лучшее решение, но оно удаляет магические функции и его легко понять и повторить для нового пользователя, такого как я :)

person Leo    schedule 11.06.2015