Django дає поганий запит (400), коли DEBUG = False


254

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


Варто пам’ятати: не додавати «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: Вибачте, я не знаю, що це може бути.
Martijn Pieters

1
Чи можете ви запропонувати мені, як це зробити, оскільки мій проект триває у виробництві.
MegaBytes

Знову ж таки, я не маю уявлення навіть про те, що ви налаштовуєте False. Можливо, ви могли б поставити нове запитання?
Martijn Pieters

9
@MegaBytes Коли DEBUG не відповідає дійсності, весь статичний файл подається з 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 /

Я сподіваюся, що це вам допоможе.

ПД: вибачте за мою погану англійську.


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


Дякую, що поділились. У моєму випадку в prod, після того як я додаю LOGGING = ..., я бачу помилку "ValueError: Відсутній запис маніфесту статичних файлів для ... css". Тоді я використовую "python manager.py collectionstatic", як згадував вище @ 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 та voila!

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


0

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

В іншому випадку ви можете отримати помилку від поганого запиту (400) від django.


0

Спробуйте запустити свій сервер з - незахищеним саме так:

python Manag.py runserver - незахищеність


0

Мені спочатку довелося зупинити сервер apache.

(фе sudo systemctl stop httpd.service/ sudo systemctl disable httpd.service).

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

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.