Подтвердить что ты не робот

Отладка ошибочного запроса Apache/Django/WSGI (400)

Мое простое приложение Django отлично работало в режиме отладки (manage.py runserver) и работает под WSGI + Apache в моем блоке dev, но когда я нажал на EC2, я начал получать прерывистые (10-80% времени) ошибки Bad Request (400) для любых URL-адресов, которые я пытаюсь просмотреть (будь то в приложении или в администраторе Django.

Где я могу найти отладочную информацию об этом? Ничего не отображается в /var/log/apache2/error.log, даже с LogLevel=info. Я проверил версии, зарегистрировал среду запроса (см. Советы по отладке ModWSGI) и не вижу существенных отличий.

Единственным оставшимся я считаю, что я использую mod_wsgi из Ubuntu 12.04 (libapache2-mod-wsgi 3.3-4build1), который был создан против Python 2.7.1; У меня Python 2.7.3. И Django - 1.6, новее, чем версия Ubuntu Precise. Я стесняюсь приступать к созданию пакетов из исходного кода, так как это так сложно очистить, и это похоже на незначительные изменения в версии...

Благодарим за помощь.

(Для справки, вот настройки Apache и приложения WSGI)

Конфигурация Apache (000 по умолчанию)

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www
    WSGIScriptAlias /rz /usr/local/share/rz/rz.wsgi
    ...

Приложение rz.WSGI

import os
import sys
import django.core.handlers.wsgi
import pprint

path = '/usr/local/share/rz'
if path not in sys.path:
    sys.path.insert(0, path)

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

class LoggingMiddleware:
    def __init__(self, application):
        self.__application = application

    def __call__(self, environ, start_response):
        errors = environ['wsgi.errors']
        pprint.pprint(('REQUEST', environ), stream=errors)

        def _start_response(status, headers, *args):
            pprint.pprint(('RESPONSE', status, headers), stream=errors)
            return start_response(status, headers, *args)

        return self.__application(environ, _start_response)

application = LoggingMiddleware(django.core.handlers.wsgi.WSGIHandler())
4b9b3361

Ответ 1

Добавьте настройку ALLOWED_HOSTS к вашим параметрам settings.py, например...

ALLOWED_HOSTS = [
    '.example.com', # Allow domain and subdomains
    '.example.com.', # Also allow FQDN and subdomains
]

У меня была такая же проблема и нашла ответ здесь, в документах

update: django 1.6 docs больше не в сети, я обновил ссылку, чтобы перейти к django 1.7 docs для ALLOWED_HOSTS.

Ответ 2

Если вы определенно установили ALOWED_HOSTS - убедитесь, что ваше имя хоста не содержит символов подчеркивания. Это технически незаконно.

Мне пришлось распечатывать различные функции, и он сводился к этому регулярному выражению, не обнаружив домен в django.http

host_validation_re = re.compile(r"^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9:]+\])(:\d+)?$")

И действительно, мой домен имел в нем символ подчеркивания.

Ответ 3

Это не решение, но для целей отладки вы можете установить настройку ALLOWED_HOSTS в своих настройках. Как это сделать

ALLOWED_HOSTS = ['*']

Это определенно должно работать. Если нет, по крайней мере, вы узнаете, что проблема не в Django, лишенном доступа к данному URL.