Ошибка отладки Apache/Django/WSGI Bad Request (400)

мое простое приложение Django отлично работало в режиме отладки (manage.py runserver), и работает под WSGI+Apache на моем dev box, но когда я нажал на 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. Я не решаюсь начать создавать пакеты из источника, так как это так сложно очистить, и это похоже на незначительные изменения версии...

Спасибо за помощь.

(для ссылка, вот Apache config и WSGI приложения)

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

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    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())

3 ответов


добавьте параметр ALLOWED_HOSTS в свой settings.py вот так...

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

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

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


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

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

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

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


Это не является решением, но и отладки вы можете установить параметр ALLOWED_HOSTS в своем settings.py вот так!--6-->

ALLOWED_HOSTS = ['*']

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