Django zgłasza niepoprawne żądanie (400), gdy DEBUG = False


254

Jestem nowy w django-1.6. Kiedy uruchamiam serwer django DEBUG = True, działa idealnie. Ale kiedy zmieniam DEBUGna Falsew pliku ustawień, serwer zatrzymał się i wyświetla następujący błąd w wierszu polecenia:

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

Po zmianie ALLOWED_HOSTSna ["http://127.0.0.1:8000",]w przeglądarce pojawia się błąd:

Bad Request (400)

Czy można uruchomić Django bez trybu debugowania?


Jedną rzecz do zapamiętania: nie dodawaj „http” ani „https” wALLOWED_HOSTS
shellbye

Odpowiedzi:


415

ALLOWED_HOSTSLista powinna zawierać w pełni kwalifikowanych nazw hostów , a nie adresów URL. Pomiń port i protokół. Jeśli używasz 127.0.0.1, dodałbym również localhostdo listy:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Możesz także użyć *do dopasowania dowolnego hosta:

ALLOWED_HOSTS = ['*']

Cytując dokumentację:

Wartości na tej liście mogą być w pełni kwalifikowanymi nazwami (np. 'www.example.com'), W takim przypadku zostaną one dokładnie dopasowane do Hostnagłówka żądania (bez rozróżniania wielkości liter, nie uwzględniając portu ). Wartość zaczynającą się od kropki można wykorzystać jako symbol wieloznaczny subdomeny: '.example.com'będzie pasować example.com,www.example.com oraz wszelkie inne subdomeny example.com. Wartość '*'będzie pasować do wszystkiego; w takim przypadku jesteś odpowiedzialny za własne sprawdzenie poprawności Hostnagłówka (być może w oprogramowaniu pośrednim; jeśli tak, to oprogramowanie pośrednie musi być wymienione jako pierwsze w MIDDLEWARE_CLASSES).

Odważny nacisk moje .

Otrzymana odpowiedź o statusie 400 jest spowodowana SuspiciousOperationwyjątkiem , gdy nagłówek hosta nie pasuje do żadnych wartości na tej liście.


3
Dzięki, działa, ale kiedy ustawię False, pojawia się jeden problem, ponieważ wszystkie pliki statyczne są pokazane jako 404. Nie mogłem zrozumieć, dlaczego nie znaleziono
MegaBytes

@MegaBytes: przepraszam, nie wiem co to może być.
Martijn Pieters

1
Czy możesz mi zasugerować, jak to zrobić, ponieważ mój projekt rozpoczyna produkcję.
MegaBytes

Znów nie mam pojęcia, do czego zmierzasz False. Może mógłbyś opublikować nowe pytanie?
Martijn Pieters

9
@MegaBytes Gdy DEBUG ma wartość False, wszystkie pliki statyczne są podawane ze STATIC_ROOT, więc prawdopodobnie ./manage.py collectstaticzrobi to.
Blackeagle52

6

Dla mnie ten błąd wystąpił, nie ustawiając wartości USE_X_FORWARDED_HOSTtrue. Z dokumentów:

Należy to włączyć tylko wtedy, gdy używany jest serwer proxy, który ustawia ten nagłówek.

Moja usługa hostingowa wyraźnie napisała w swojej dokumentacji, że należy użyć tego ustawienia i otrzymuję ten błąd 400, jeśli go zapomnę.


Czy jest to konieczne, jeśli ALLOWED_HOSTS = ['*']?
Mike Stoddart,

1
Myślę, że ALLOWED_HOSTS blokuje cały host. USE_X_FORWARDED_HOST określa tylko, czy używany jest nagłówek HTTP.
Keith,

3

Miałem ten sam problem i naprawiłem go, ustawiając ALLOWED_HOSTS = ['*']i rozwiązując problem ze statycznymi obrazami, musisz zmienić wirtualne ścieżki w konfiguracji środowiska w następujący sposób:

Virtual Path                 Directory

/ static / / opt / python / current / app / yourpj / static /
/ media / / opt / python / current / app / Nuevo / media /

Mam nadzieję, że Ci to pomoże.

PD: Przepraszam za mój zły angielski.


2

Miałem ten sam problem i żadna z odpowiedzi nie rozwiązała mojego problemu, w celu rozwiązania takiej sytuacji lepiej włączyć rejestrowanie, dodając następującą konfigurację do settings.pytymczasowej

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, }, }, }

i spróbuj tail -f /tmp/debug.log. a kiedy zobaczysz swój problem, możesz sobie z nim poradzić znacznie łatwiej niż debugowanie w ciemno.

Mój problem już miał

Nieprawidłowy nagłówek HTTP_HOST: „pt_web: 8000”. Podana nazwa domeny jest nieprawidłowa zgodnie z RFC 1034/1035.

i rozwiązać go poprzez dodanie proxy_set_header Host $host;do pliku konfiguracyjnego Nginx i umożliwiając przekierowanie portów przez USE_X_FORWARDED_PORT = Truew settings.py(to dlatego, że w moim przypadku ja słuchałem zamówienie w Nginx na porcie 8080i przekazać je do guniportu8000


Dzięki za udostępnienie. W moim przypadku w prod, po dodaniu LOGGING = ..., pojawia się błąd „ValueError: Brak wpisu manifestu plików statycznych dla ... css”. Następnie używam „python manager.py collectstatic”, jak wspomniano powyżej przez @ Blackeagle52, błąd 500 (może być również 400 błędem w moim lokalnym dev) jest rozwiązany.
zhihong

1

Dla mnie, ponieważ mam już xampp na 127.0.0.1 i django na 127.0.1.1 i próbowałem dodawać hosty

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

i dostałem ten sam błąd lub (400) złe żądanie wprowadź opis zdjęcia tutaj

więc zmieniam adres URL na 127.0.1.1:( użyty port) / project i voila!

musisz sprawdzić jaki jest twój wirtualny adres sieciowy, dla mnie, ponieważ używam stosu bitnami django 2.2.3-1 w systemie Linux, mogę sprawdzić, którego portu używa django. jeśli masz błąd (400 złych żądań), to chyba django w innej sieci wirtualnej .. powodzenia wprowadź opis zdjęcia tutaj


0

W DEBUG = Falsepliku ustawień musisz także skonfigurować listę ALLOWED_HOST. Spróbuj dołączyćALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

W przeciwnym razie możesz otrzymać błąd Bad Request (400) od django.


0

Spróbuj uruchomić serwer z opcją --insecure w następujący sposób:

python manage.py runserver --insecure


0

Najpierw musiałem zatrzymać serwer apache.

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

To rozwiązało mój problem oprócz edycji settings.pypliku „ ”

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.