Django donne une mauvaise requête (400) lorsque DEBUG = False


254

Je suis nouveau sur django-1.6. Lorsque je lance le serveur django avec DEBUG = True, il fonctionne parfaitement. Mais lorsque je passe DEBUGà Falsedans le fichier de paramètres, le serveur s'est arrêté et il donne l'erreur suivante à l'invite de commande:

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

Après avoir changé ALLOWED_HOSTSpour ["http://127.0.0.1:8000",], dans le navigateur, j'obtiens l'erreur:

Bad Request (400)

Est-il possible d'exécuter Django sans mode de débogage?


Une chose à retenir: n'ajoutez pas 'http' ou 'https' dansALLOWED_HOSTS
shellbye

Réponses:


415

La ALLOWED_HOSTSliste doit contenir qualifiés noms d'hôte , non urls. Oubliez le port et le protocole. Si vous utilisez 127.0.0.1, j'ajouterais aussi localhostà la liste:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Vous pouvez également utiliser *pour faire correspondre n'importe quel hôte:

ALLOWED_HOSTS = ['*']

Citant la documentation:

Les valeurs de cette liste peuvent être des noms complets (par exemple 'www.example.com'), auquel cas ils seront mis en correspondance avec l'en- Hosttête de la demande exactement (insensible à la casse, sans inclure le port ). Une valeur en commençant par une période peut être utilisé comme générique sous - domaine: '.example.com'correspondra example.com, www.example.comet tout autre sous - domaine example.com. Une valeur de '*'correspondra à tout; dans ce cas, vous êtes responsable de fournir votre propre validation de l'en- Hosttête (peut-être dans un middleware; si tel est le cas, ce middleware doit être répertorié en premier MIDDLEWARE_CLASSES).

Accentuation mienne .

La réponse d'état 400 que vous obtenez est due à une SuspiciousOperationexception levée lorsque votre en-tête d'hôte ne correspond à aucune valeur de cette liste.


3
Merci, cela fonctionne, mais quand je définis False, un problème survient, pour tous les fichiers statiques est indiqué comme 404. Je ne pouvais pas comprendre pourquoi il ne donne pas trouvé
MegaBytes

@MegaBytes: désolé, je ne sais pas ce que cela pourrait être.
Martijn Pieters

1
Pouvez-vous me suggérer comment le faire, car mon projet est en cours de production.
MegaBytes

Encore une fois, je n'ai aucune idée de ce que vous envisagez False. Vous pourriez peut-être poster une nouvelle question?
Martijn Pieters

9
@MegaBytes Lorsque DEBUG est False, tous les fichiers statiques sont servis à partir de STATIC_ROOT, donc probablement une ./manage.py collectstaticvolonté.
Blackeagle52

6

Pour moi, j'ai eu cette erreur en ne définissant pas USE_X_FORWARDED_HOSTsur true. De la documentation:

Cela ne doit être activé que si un proxy qui définit cet en-tête est utilisé.

Mon service d'hébergement a écrit explicitement dans sa documentation que ce paramètre doit être utilisé, et j'obtiens cette erreur 400 si je l'oublie.


Est-ce nécessaire si ALLOWED_HOSTS = ['*']?
Mike Stoddart

1
Je pense que ALLOWED_HOSTS bloque tout l'hôte. USE_X_FORWARDED_HOST détermine uniquement si un en-tête HTTP est utilisé.
Keith

3

J'ai eu le même problème et je l'ai résolu en définissant ALLOWED_HOSTS = ['*']et pour résoudre le problème avec les images statiques, vous devez changer les chemins virtuels dans la configuration de l'environnement comme ceci:

                Répertoire du chemin virtuel

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

J'espère que ça t'aide.

PD: désolé pour mon mauvais anglais.


2

J'ai eu le même problème et aucune des réponses n'a résolu mon problème, pour résoudre la situation comme celle-ci, il est préférable d'activer la journalisation en ajoutant la configuration suivante à settings.pytemporaire

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

et essayez de tail -f /tmp/debug.log. et lorsque vous voyez votre problème, vous pouvez le gérer beaucoup plus facilement que le débogage aveugle.

Mon problème était sur le point de

En-tête HTTP_HOST non valide: 'pt_web: 8000'. Le nom de domaine fourni n'est pas valide selon la RFC 1034/1035.

et le résoudre en ajoutant proxy_set_header Host $host;au fichier de configuration Nginx et en activant la redirection de port par USE_X_FORWARDED_PORT = Truedans settings.py(c'est parce que dans mon cas, j'ai écouté demander dans Nginx sur le port 8080et le passer sur gunile port8000


Merci d'avoir partagé. Pour mon cas dans prod, après avoir ajouté le LOGGING = ..., alors je vois l'erreur "ValueError: Entrée de manifeste de fichiers statiques manquante pour ... css". Ensuite, j'utilise "python manager.py collectstatic" comme mentionné ci-dessus par @ Blackeagle52, l'erreur 500 (peut également être 400 erreur dans mon dev local) est résolue.
zhihong

1

Pour moi car j'ai déjà xampp sur 127.0.0.1 et django sur 127.0.1.1 et j'ai continué à essayer d'ajouter des hôtes

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

et j'ai la même erreur ou (400) mauvaise demande entrez la description de l'image ici

donc je change l'url en 127.0.1.1:(le port utilisé) / project et le tour est joué!

vous devez vérifier quelle est votre adresse de réseau virtuel, pour moi, comme j'utilise la pile bitnami django 2.2.3-1 sous Linux, je peux vérifier quel port django utilise. si vous avez une erreur (400 mauvaise requête) alors je suppose que django sur un réseau virtuel différent .. bonne chance entrez la description de l'image ici


0

Avec DEBUG = Falsevotre fichier de paramètres, vous devez également configurer la liste ALLOWED_HOST. Essayez d'inclureALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

Sinon, vous pourriez recevoir une erreur Bad Request (400) de django.


0

Essayez d'exécuter votre serveur avec --insecure comme ceci:

python manage.py runserver --insecure


0

J'ai dû d'abord arrêter le serveur Apache.

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

Cela a résolu mon problème en plus de modifier le settings.pyfichier ' '

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.