it-swarm.com.ru

Джанго дает неверный запрос (400), когда DEBUG = False

Я новичок в Django-1.6. Когда я запускаю сервер Django с DEBUG = True, он работает отлично. Но когда я изменяю DEBUG на False в файле настроек, сервер останавливается и выдает следующую ошибку в командной строке:

CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.

После того, как я изменил ALLOWED_HOSTS на ["http://127.0.0.1:8000",], в браузере я получаю сообщение об ошибке:

Bad Request (400)

Можно ли запустить Django без режима отладки?

223
codeimplementer

Список ALLOWED_HOSTS должен содержать полностью определенные имена хостов, не urls. Не указывайте порт и протокол. Если вы используете 127.0.0.1, я бы также добавил localhost в список:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Вы также можете использовать * для соответствия любой Хост:

ALLOWED_HOSTS = ['*']

Цитирование документации:

Значения в этом списке могут быть полностью определенными именами (например, 'www.example.com'), и в этом случае они будут точно сопоставлены с заголовком Host запроса (без учета регистра, не включая порт). Значение, начинающееся с точки, можно использовать в качестве подстановочного знака субдомена: '.example.com' будет соответствовать example.com, www.example.com и любому другому субдомену example.com. Значение '*' будет соответствовать чему угодно; в этом случае вы несете ответственность за обеспечение собственной проверки заголовка Host (возможно, в промежуточном программном обеспечении; в этом случае это промежуточное программное обеспечение должно быть указано первым в MIDDLEWARE_CLASSES).

Жирный акцент мой.

Ответ статуса 400 вы получаете из-за SuspiciousOperation исключения , которое возникает, когда заголовок вашего хоста не соответствует никаким значениям в этом списке.

376
Martijn Pieters

У меня была та же проблема, и я исправил ее, установив ALLOWED_HOSTS = ['*'], и для решения проблемы со статическими образами вы должны изменить виртуальные пути в конфигурации среды следующим образом:

Виртуальный путь Справочник

/Статический// Opt/питон/ток/приложение/yourpj/статический /
/media// opt/python/current/app/Nuevo/media /

Я надеюсь, что это поможет вам.

PD: извините за мой плохой английский.

3
Jorge

Для меня я получил эту ошибку, не установив USE_X_FORWARDED_Host в true. Из документов: 

Это должно быть включено, только если используется прокси, который устанавливает этот заголовок.

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

3
Keith

У меня была такая же проблема, и ни один из ответов не решил мою проблему, для решения подобной ситуации лучше включить ведение журнала, добавив следующую конфигурацию в settings.py временный

LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/tmp/debug.log', }, }, 'loggers': { 'Django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }

и попробуйте tail -f /tmp/debug.log. и когда вы увидите свою проблему, вы можете справиться с ней намного проще, чем слепая отладка.

Моя проблема была на 

Неверный заголовок HTTP_Host: «pt_web: 8000». Указанное доменное имя недействительно в соответствии с RFC 1034/1035.

и разрешите его, добавив proxy_set_header Host $Host; в файл конфигурации Nginx и включив переадресацию портов с помощью USE_X_FORWARDED_PORT = True в settings.py (это потому, что в моем случае я прослушал запрос в Nginx на порту 8080 и передал его guni на порт 8000

1
Yusef Mohamadi

С DEBUG = False в вашем файле настроек, вам также нужно настроить список ALLOWED_Host . Попробуйте включить ALLOWED_Host = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

В противном случае вы можете получить ошибку Bad Request (400) от Django.

0
Abhishek Lodha