Проблемы интеграции DJANGO-REST, MOD_WSGI и APACHE

Я пытался интегрировать DJANGO-REST WS в apache с помощью MOD_WSGI, но после нескольких часов попыток применить все методы отладки и различные сценарии wsgi я был бы признателен за некоторую помощь.

Версия сервера: Apache / 2.2.22 (Ubuntu) Python 2.7.3 (по умолчанию, 27 февраля 2014 г., 19:58:35) Версия MOD_WSGI: 3.3

В настоящее время мой файл WSGI выглядит следующим образом:

"""
WSGI config for zighome_rest project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
"""

import os, sys
sys.path.append('/usr/local/ZigHomeWS')
sys.path.append('/usr/local/ZigHomeWS/zighome_rest')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "zighome_rest.settings")

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

и мой виртуальный хост настроен, как показано ниже:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName my.server.name

    DocumentRoot /usr/local/DummyApp

        WSGIDaemonProcess ZigHomeWS python-path=/usr/local/ZigHomeWS/zighome_rest:/usr/lib/python2.7:/usr/local/lib/python2.7/site-packages/django
        WSGIProcessGroup ZigHomeWS
        WSGIApplicationGroup %{GLOBAL}

        WSGIScriptAlias /ZigHomeWS /usr/local/ZigHomeWS/zighome_rest/zighome_rest/WSGI/django.wsgi
        WSGIPassAuthorization On

        <Directory /usr/local/ZigHomeWS/zighome_rest>
            <Files django.wsgi>
                Order deny,allow
                Allow from all
            </Files>
        </Directory>

        <Directory /usr/local/DummyApp>
            Order deny,allow
            Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error_ZigHomeWS.log

        # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel info

</VirtualHost>

Текущий файл settings.py имеет следующую конфигурацию:

"""
Django settings for zighome_rest project.

For more information on this file, see
https://docs.djangoproject.com/en/1.6/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.6/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '6h34&@m=1t4!(axkhz1+%6%u8^o(7^ao500pl#*+=$sk(a846@'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'configuration',
    'execution',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'zighome_rest.urls'

WSGI_APPLICATION = 'zighome_rest.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/usr/local/ZigHomeWS/zighome_rest/zighome.db',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

# Internationalization
# https://docs.djangoproject.com/en/1.6/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.6/howto/static-files/

STATIC_URL = '/static/'

Как только я вызываю одну из служб с помощью curl, вот так:

curl -X POST http://my.server.name/ZigHomeWS/execution/start/ -u user:passwd

Я регистрирую следующую ошибку:

[Sat Sep 27 19:15:28 2014] [info] mod_wsgi (pid=13351): Adding '/usr/local/ZigHomeWS/zighome_rest' to path.
[Sat Sep 27 19:15:28 2014] [info] mod_wsgi (pid=13351): Adding '/usr/lib/python2.7' to path.
[Sat Sep 27 19:15:28 2014] [info] mod_wsgi (pid=13351): Adding '/usr/local/lib/python2.7/site-packages/django' to path.
[Sat Sep 27 19:15:32 2014] [info] [client 46.189.221.224] mod_wsgi (pid=13351, process='ZigHomeWS', application=''): Loading WSGI script '/usr/local/ZigHomeWS/zighome_rest/zighome_rest/WSGI/django.wsgi'.
[Sat Sep 27 18:15:33 2014] [error] No handlers could be found for logger "django.request"
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224] mod_wsgi (pid=13351): Exception occurred processing WSGI script '/usr/local/ZigHomeWS/zighome_rest/zighome_rest/WSGI/django.wsgi'.
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224] Traceback (most recent call last):
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 187, in __call__
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     response = self.get_response(request)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 199, in get_response
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 236, in handle_uncaught_exception
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return debug.technical_500_response(request, *exc_info)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/views/debug.py", line 91, in technical_500_response
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     html = reporter.get_traceback_html()
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/views/debug.py", line 350, in get_traceback_html
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return t.render(c)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 148, in render
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return self._render(context)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 142, in _render
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return self.nodelist.render(context)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 844, in render
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     bit = self.render_node(node, context)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py", line 80, in render_node
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return node.render(context)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py", line 90, in render
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     output = self.filter_expression.resolve(context)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 624, in resolve
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     new_obj = func(obj, *arg_vals)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/template/defaultfilters.py", line 769, in date
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return format(value, arg)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/dateformat.py", line 343, in format
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return df.format(format_string)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/dateformat.py", line 35, in format
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     pieces.append(force_text(getattr(self, piece)()))
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/dateformat.py", line 268, in r
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return self.format('D, j M Y H:i:s O')
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/dateformat.py", line 35, in format
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     pieces.append(force_text(getattr(self, piece)()))
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/encoding.py", line 85, in force_text
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     s = six.text_type(s)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 144, in __text_cast
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return func(*self.__args, **self.__kw)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/__init__.py", line 83, in ugettext
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return _trans.ugettext(message)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 325, in ugettext
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     return do_translate(message, 'ugettext')
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 306, in do_translate
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     _default = translation(settings.LANGUAGE_CODE)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 209, in translation
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     default_translation = _fetch(settings.LANGUAGE_CODE)
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 189, in _fetch
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224]     "The translation infrastructure cannot be initialized before the "
[Sat Sep 27 18:15:33 2014] [error] [client 46.189.221.224] AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time.

Должен признаться, что добавление «/usr/local/lib/python2.7/site-packages/django» было всего лишь мерой отчаяния, которое закончилось тем, что ни к чему не привело.

Одна вещь, которую я, вероятно, должен упомянуть, хотя это не должно иметь никакого значения для решения, заключается в том, что основная система на самом деле является системой C ++, которую я обернул с помощью SWIG.

Излишне говорить, что он работает в среде разработки Django-REST.

И последнее, но не менее важное: если в файле сценария WSGI я изменю эти две строки:

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

этим:

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

Он выйдет из строя вместо предоставления трассировки стека в файле журнала:

[Sat Sep 27 19:44:10 2014] [error] [client X.X.X.X] Premature end of script headers: django.wsgi

В конце концов я применил рекомендуемые методы отладки, но, к сожалению, это не очень помогло, поскольку трассировка стека gdb только что дала мне:

(gdb) cont
Continuing.
[New Thread 0x7fc6d4de9700 (LWP 9312)]
[New Thread 0x7fc6d45e8700 (LWP 9313)]
[Thread 0x7fc6dde3a700 (LWP 9242) exited]
[Thread 0x7fc6d45e8700 (LWP 9313) exited]
[Thread 0x7fc6d4de9700 (LWP 9312) exited]
[Thread 0x7fc6dd639700 (LWP 9245) exited]
[Thread 0x7fc6e364a740 (LWP 9216) exited]
[Inferior 1 (process 9216) exited with code 01]

Расследование:

Итак ... Я только что кое-что понял.

Из того, что я прочитал с нескольких сайтов в Интернете, я действительно должен использовать этот вызов:

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

в сценарии WSGI. Поскольку с этими двумя строками кода, которые все время давали сбой, у меня ничего не получалось быстро, я не забыл вызвать любую другую веб-службу, которую я создал, и VOILA !! Оно работает. (Не знаю, почему я не пробовал это раньше ... наверное, упрямство)

Теперь одно из основных различий между двумя веб-сервисами заключается в том, что один только анализирует некоторый XML-файл и добавляет данные в базу данных sqlite3, а другой (тот, который дает сбой), запускает всю систему, что подразумевает создание из нескольких потоков и так далее.

Таким образом, теперь я ищу любые документированные проблемы, связанные с потоками, которые я могу найти с помощью modwsgi.


Я надеюсь, ты сможешь мне помочь

Спасибо


person cvicente    schedule 28.09.2014    source источник
comment
Пожалуйста, обновите вопрос с помощью вашего файла настроек.   -  person Burhan Khalid    schedule 28.09.2014
comment
Я отредактировал вопрос, добавив запрошенную конфигурацию файла settings.py.   -  person cvicente    schedule 28.09.2014
comment
Из-за ошибки кажется, что вы используете gettext, когда вы должны использовать gettext_lazy в каком-то файле; из ваших настроек это не ясно. Однако проверьте другие свои приложения. Если вы закомментируете rest_framework из INSTALLED_APPS, вы все равно получите ошибку?   -  person Burhan Khalid    schedule 28.09.2014
comment
Если я прокомментирую rest_framework из INSTALLED_APPS, вся цель WebService перестанет существовать. Я имею в виду ... это суть службы. Без этого мне нечего развертывать.   -  person cvicente    schedule 28.09.2014
comment
Дело в том, чтобы определить причину проблемы. У вас также есть два других приложения в ваших настройках   -  person Burhan Khalid    schedule 28.09.2014
comment
Не поймите меня неправильно, я прекрасно понимаю вашу точку зрения. Но удаление rest_framework из загруженных приложений похоже на удаление django из django_framework. Я не смогу вызвать WS, который в данный момент выдает ошибку. Для ясности: я не получаю сообщение об ошибке сразу после запуска приложения. Отредактирую вопрос, чтобы было понятно!   -  person cvicente    schedule 28.09.2014


Ответы (1)


Я обновил свой wsgi.py файл с:

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

To:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
person Mathew Lin    schedule 05.12.2014
comment
Да ... Я тоже это уже делал, но это не работает. Похоже, это как-то связано с потоками, которые я запускаю на стороне C ++. Странно то, что когда я использую uwsgi + nginx, он работает безупречно. - person cvicente; 23.12.2014