Django gibt Bad Request (400), wenn DEBUG = False

254

Ich bin neu in Django-1.6. Wenn ich den Django-Server mit betreibe DEBUG = True, läuft er perfekt. Wenn ich DEBUGjedoch Falsein die Einstellungsdatei wechsle , wird der Server gestoppt und an der Eingabeaufforderung wird der folgende Fehler angezeigt:

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

Nachdem ich zu gewechselt ALLOWED_HOSTShabe ["http://127.0.0.1:8000",], erhalte ich im Browser die Fehlermeldung:

Bad Request (400)

Ist es möglich, Django ohne Debug-Modus auszuführen?

Codeimplementierer
quelle
Eine Sache zu ALLOWED_HOSTS
beachten

Antworten:

415

Die ALLOWED_HOSTSListe sollte vollständig qualifizierte Hostnamen und keine URLs enthalten. Lassen Sie den Port und das Protokoll weg. Wenn Sie verwenden 127.0.0.1, würde ich localhostder Liste auch hinzufügen :

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Sie können auch verwenden , *passen jeden Host:

ALLOWED_HOSTS = ['*']

Zitieren der Dokumentation:

Werte in dieser Liste können vollständig qualifizierte Namen sein (z. B. 'www.example.com'). In diesem Fall werden sie genau mit dem HostHeader der Anforderung abgeglichen (ohne Berücksichtigung der Groß- und Kleinschreibung, ohne Port ). Ein Wert mit einem Punkt beginnen kann als Sub - Domain Platzhalter verwendet werden: '.example.com'passt auf example.com, www.example.comund alle anderen Sub - Domain von example.com. Ein Wert von '*'wird mit allem übereinstimmen; In diesem Fall sind Sie dafür verantwortlich, Ihre eigene Validierung des HostHeaders bereitzustellen (möglicherweise in einer Middleware; in diesem Fall muss diese Middleware zuerst in aufgeführt werden MIDDLEWARE_CLASSES).

Meine kühne Betonung .

Die Status 400-Antwort, die Sie erhalten, ist auf eine SuspiciousOperationAusnahme zurückzuführen , die ausgelöst wird, wenn Ihr Host-Header keinen Werten in dieser Liste entspricht.

Martijn Pieters
quelle
3
Danke, es funktioniert, aber wenn ich False setze, kommt ein Problem, denn alle statischen Dateien werden als 404 angezeigt. Ich konnte nicht verstehen, warum es nicht gefunden wird
MegaBytes
@ MegaBytes: Entschuldigung, ich weiß nicht, was das sein könnte.
Martijn Pieters
1
Können Sie mir vorschlagen, wie es geht, weil mein Projekt in Produktion geht?
MegaBytes
Auch hier habe ich keine Ahnung, worauf Sie sich einstellen False. Vielleicht könnten Sie eine neue Frage stellen?
Martijn Pieters
9
@MegaBytes Wenn DEBUG False ist, werden alle statischen Dateien von STATIC_ROOT bereitgestellt, was wahrscheinlich auch der Fall ist ./manage.py collectstatic.
Blackeagle52
6

Ich habe diesen Fehler erhalten, indem ich nicht USE_X_FORWARDED_HOSTauf true gesetzt habe. Aus den Dokumenten:

Dies sollte nur aktiviert werden, wenn ein Proxy verwendet wird, der diesen Header setzt.

Mein Hosting-Service hat in seiner Dokumentation ausdrücklich geschrieben, dass diese Einstellung verwendet werden muss , und ich erhalte diesen 400-Fehler, wenn ich ihn vergesse.

Keith
quelle
Ist dies erforderlich, wenn ALLOWED_HOSTS = ['*']?
Mike Stoddart
1
Ich denke, ALLOWED_HOSTS blockiert den gesamten Host. USE_X_FORWARDED_HOST bestimmt nur, ob ein HTTP-Header verwendet wird.
Keith
3

Ich hatte das gleiche Problem und habe es behoben, indem ich ALLOWED_HOSTS = ['*']die virtuellen Pfade in der Umgebungskonfiguration wie folgt geändert habe, um das Problem mit den statischen Images festzulegen und zu lösen:

Virtual Path                 Verzeichnis

/ static / / opt / Python / Strom / app / yourpj / static /
/ media / / opt / Python / Strom / app / Nuevo / media /

Ich hoffe es hilft dir.

PD: Entschuldigung für mein schlechtes Englisch.

Jorge
quelle
2

Ich hatte das gleiche Problem und keine der Antworten löste mein Problem. Um diese Situation zu lösen, ist es besser, die Protokollierung zu aktivieren, indem Sie die folgende Konfiguration zu settings.pytemporär hinzufügen

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

und versuche es tail -f /tmp/debug.log. und wenn Sie Ihr Problem sehen, können Sie es viel einfacher behandeln als blindes Debuggen.

Mein Problem war im Begriff zu

Ungültiger HTTP_HOST-Header: 'pt_web: 8000'. Der angegebene Domainname ist gemäß RFC 1034/1035 nicht gültig.

und beheben Sie es, indem Sie es proxy_set_header Host $host;zur Nginx-Konfigurationsdatei hinzufügen und die Portweiterleitung über USE_X_FORWARDED_PORT = Truein aktivieren settings.py(in meinem Fall habe ich die Anforderung in Nginx am Port abgehört 8080und gunian den Port übergeben8000

Yuseferi
quelle
Danke für das Teilen. Für meinen Fall in prod wird nach dem Hinzufügen von LOGGING = ... der Fehler "ValueError: Fehlender statischer Dateimanifesteintrag für ... css" angezeigt. Dann verwende ich "python manager.py collectstatic", wie oben von @ Blackeagle52 erwähnt. Der 500-Fehler (kann auch ein 400-Fehler in meinem lokalen Entwickler sein) ist behoben.
Zhihong
1

Für mich, da ich bereits xampp auf 127.0.0.1 und django auf 127.0.1.1 habe und immer wieder versucht habe, Hosts hinzuzufügen

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

und ich habe den gleichen Fehler oder (400) schlechte Anfrage Geben Sie hier die Bildbeschreibung ein

also ändere ich die url auf 127.0.1.1:(das verwendete port) / project und voila!

Sie müssen überprüfen, wie Ihre virtuelle Netzwerkadresse lautet. Wenn ich den Bitnami Django Stack 2.2.3-1 unter Linux verwende, kann ich überprüfen, welchen Port Django verwendet. Wenn Sie einen Fehler haben (400 schlechte Anfrage), dann denke ich, Django in einem anderen virtuellen Netzwerk. Viel Glück Geben Sie hier die Bildbeschreibung ein

Muhamed Noaman
quelle
0

Mit DEBUG = Falsein Ihrer Einstellungsdatei müssen Sie auch die Liste ALLOWED_HOST einrichten. Versuchen Sie es mitALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

Andernfalls erhalten Sie möglicherweise einen Fehler "Bad Request (400)" von django.

Abhishek Lodha
quelle
0

Versuchen Sie, Ihren Server mit --insecure wie folgt auszuführen:

python manage.py runserver - unsicher

Alberto
quelle
0

Ich musste zuerst den Apache-Server stoppen.

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

Das löste mein Problem neben der Bearbeitung der ' settings.py' Datei

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

Ivanovic
quelle
-4

Navigieren Sie zu den Einstellungen und suchen Sie die Datei base.py. Setzen Sie die zulässigen Hosts auf ALLOWED_HOSTS = ['*'].

Stephen Mwangi Wanjohi
quelle
4
Akzeptieren Sie die akzeptierte Antwort nicht. Löschen Sie dies, um das Forum sauber zu halten
WoodChopper
Antworte nicht so, kommentiere es
Adnan Abdollah Zaki