2017-02-02 15 views
0

Я запускаю сайт Django == 1.10.4 с 4 различными языками. У каждого из них есть собственный домен. Одновременно работают только 2 или 3 из них. Один или более неудача с этой ошибкой:Django populate() не является реентерабельным при многоязычной настройке с разными доменами

Это ошибка, которая появляется после того, как я убиваю мои процессы WSGI и получить доступ к странице в первый раз:

mod_wsgi (pid=8416): Target WSGI script '/var/www/user324/htdocs/ukmypagecom/app.wsgi' cannot be loaded as Python module. 
mod_wsgi (pid=8416): Exception occurred processing WSGI script '/var/www/user324/htdocs/ukmypagecom/app.wsgi'. 
Traceback (most recent call last): 
    File "/var/www/user324/htdocs/ukmypagecom/app.wsgi", line 11, in <module> 
    application = django.core.wsgi.get_wsgi_application() 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application 
    django.setup(set_prefix=False) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/__init__.py", line 27, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/apps/config.py", line 199, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/contrib/auth/models.py", line 4, in <module> 
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 52, in <module> 
    class AbstractBaseUser(models.Model): 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/db/models/base.py", line 119, in __new__ 
    new_class.add_to_class('_meta', Options(meta, app_label)) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/db/models/base.py", line 316, in add_to_class 
    value.contribute_to_class(cls, name) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/db/models/options.py", line 214, in contribute_to_class 
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length()) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/db/__init__.py", line 33, in __getattr__ 
    return getattr(connections[DEFAULT_DB_ALIAS], item) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/db/utils.py", line 211, in __getitem__ 
    backend = load_backend(db['ENGINE']) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/db/utils.py", line 134, in load_backend 
    raise ImproperlyConfigured(error_msg) 
ImproperlyConfigured: 'django.contrib.gis.db.backends.mysql' isn't an available database backend. 
Try using 'django.db.backends.XXX', where XXX is one of: 
    'mysql', 'oracle', 'postgresql', 'sqlite3' 
Error was: cannot import name GEOSException 

После каждой перезагрузки страницы я получаю только эту ошибку:

mod_wsgi (pid=8416): Target WSGI script '/var/www/user324/htdocs/ukmypagecom/app.wsgi' cannot be loaded as Python module. 
mod_wsgi (pid=8416): Exception occurred processing WSGI script '/var/www/user324/htdocs/ukmypagecom/app.wsgi'. 
Traceback (most recent call last): 
    File "/var/www/user324/htdocs/ukmypagecom/app.wsgi", line 11, in <module> 
    application = django.core.wsgi.get_wsgi_application() 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application 
    django.setup(set_prefix=False) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/__init__.py", line 27, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages/django/apps/registry.py", line 78, in populate 
    raise RuntimeError("populate() isn't reentrant") 
RuntimeError: populate() isn't reentrant 

Вот как мой файл настроек ищет каждый домен.

#settings_en.py 
from base_settings import * 

ALLOWED_HOSTS = ['127.0.0.1', '.example.com' ] 
LANGUAGE_CODE = 'en-GB' 
ROOT_URLCONF = 'myproject.base_urls' 
SITE_ID = 18 

#settings_pl.py 
from base_settings import * 

ALLOWED_HOSTS = ['127.0.0.1', '.example.com' ] 
LANGUAGE_CODE = 'pl-PL' 
ROOT_URLCONF = 'myproject.base_urls' 
SITE_ID = 19 

#settings_xx.py 
... 

И это, как мой app.wsgi выглядит для каждого домена

#english version 

#!/usr/bin/python 
import sys, os 

sys.path.insert(0, '/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages') #virtualenv 
sys.path.insert(0, '/var/www/user324/priv/mysourcecode') #sourcecode 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings_en' 

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


#polish version 
#!/usr/bin/python 
import sys, os 

sys.path.insert(0, '/var/www/user324/priv/venv/myvenv/lib/python2.7/site-packages') 
sys.path.insert(0, '/var/www/user324/priv/mysourcecode') 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings_pl' 

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

Любая идея, что происходит здесь не так?

После того как я перезапустил свои процессы wsgi, некоторые домены работают, некоторые из них не работают. Каждый домен получает доступ к одному исходному коду и той же базе данных. Поэтому я думаю, что нет проблем с исходным кодом, потому что те сайты, которые запускаются напрямую, не имеют никаких проблем.

ответ

0

Это не похоже на проблему Django, а на неправильную конфигурацию mod_wsgi - похоже, ваши приложения могут работать в одном интерпретаторе и конфликтуют.

Как настроен ваш Apache/mod_wsgi? Особый интерес состоит в том, что daemon mode должен быть включен, а демон отдельно для каждого сайта. (See that directive's docs.)

Кроме того, я предлагаю изучить обслуживание вашего приложения с чем-то другим, чем Apache/mod_wsgi - Nginx + uWSGI - мое оружие выбора.

+1

Вы были правы. Я запускаю для каждого сайта другого демона, и все снова работает отлично. Спасибо! –