Отладка ошибочного запроса 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())
Ответы
Ответ 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.