Ошибка отладки 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-адресу.