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

254

Я новичок в Джанго-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 без режима отладки?

codeimplementer
источник
Помните одну вещь: не добавляйте 'http' или 'https' вALLOWED_HOSTS
shellbye

Ответы:

415

ALLOWED_HOSTSСписок должен содержать полные имена хостов , а не URL. Не указывайте порт и протокол. Если вы используете 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исключения , возникающего, когда заголовок вашего хоста не соответствует никаким значениям в этом списке.

Мартейн Питерс
источник
3
Спасибо, это работает, но когда я установил False, возникает одна проблема, для всех статических файлов отображается как 404. Я не мог понять, почему это дает не найдено
MegaBytes
@MegaBytes: извините, я не знаю, что это может быть.
Мартин Питерс
1
Можете ли вы предложить мне, как это сделать, потому что мой проект идет в производство.
MegaBytes
Опять же, я понятия не имею, к чему ты клонишь False. Возможно, вы могли бы опубликовать новый вопрос?
Мартин Питерс
9
@MegaBytes Когда DEBUG имеет значение False, все статические файлы обслуживаются из STATIC_ROOT, поэтому, вероятно, это ./manage.py collectstaticподойдет.
Blackeagle52,
6

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

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

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

Кит
источник
Это необходимо, если ALLOWED_HOSTS = ['*']?
Майк Стоддарт
1
Я думаю, что ALLOWED_HOSTS блокирует весь хост. USE_X_FORWARDED_HOST только определяет, используется ли заголовок HTTP.
Кит
3

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

                Каталог виртуальных путей

/ статический / / opt / python / current / app / yourpj / static /
/ media / / opt / python / current / app / Nuevo / media /

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

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

Jorge
источник
2

У меня была такая же проблема, и ни один из ответов не решил мою проблему, для разрешения ситуации, подобной этой, лучше включить ведение журнала, добавив следующую конфигурацию во 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

Yuseferi
источник
Спасибо, что поделился. Для моего случая в prod, после добавления LOGGING = ..., я вижу ошибку "ValueError: Отсутствует запись манифеста staticfiles для ... css". Затем я использую "python manager.py collectstatic", как упомянуто выше @ Blackeagle52, ошибка 500 (также может быть ошибка 400 в моем локальном устройстве разработки) решена.
Чжихун
1

Для меня, как у меня уже есть xampp на 127.0.0.1 и django на 127.0.1.1, и я продолжал пытаться добавить хосты

ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'www.yourdomain.com', '*', '127.0.1.1']

и я получил ту же ошибку или (400) неверный запрос введите описание изображения здесь

поэтому я меняю URL на 127.0.1.1:( используемый порт) / project и вуаля!

Вы должны проверить, каков ваш виртуальный сетевой адрес, для меня, так как я использую битнами django stack 2.2.3-1 в Linux, я могу проверить, какой порт использует django. если у вас есть ошибка (400 неправильных запросов), то я думаю, Django в другой виртуальной сети .. удачи введите описание изображения здесь

Мухамед Ноаман
источник
0

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

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

Абхишек Лодха
источник
0

Попробуйте запустить свой сервер с параметром --insecure следующим образом:

python manage.py runserver --insecure

Alberto
источник
0

Сначала мне пришлось остановить сервер apache.

(fe sudo systemctl stop httpd.service/ sudo systemctl disable httpd.service).

Это решило мою проблему, кроме редактирования settings.pyфайла ' '

в ALLOWED_HOSTS = ['se.rv.er.ip', 'www.example.com']

Ivanovic
источник
-4

Перейдите в настройки и найдите файл base.py. Установите для разрешенных хостов значение ALLOWED_HOSTS = ['*'].

Стивен Мванги Ванджохи
источник
4
Не повторяйте принятый ответ. Удалите это, чтобы поддерживать чистоту на форуме
WoodChopper
не отвечай так, прокомментируй
Аднан Абдолла Заки