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?

implémenteur de code
la source
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.

Martijn Pieters
la source
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.

Keith
la source
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.

Jorge
la source
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

Yuseferi
la source
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

Muhamed Noaman
la source
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.

Abhishek Lodha
la source
0

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

python manage.py runserver --insecure

Alberto
la source
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']

Ivanovic
la source
-4

Accédez aux paramètres et recherchez le fichier base.py Définissez les hôtes autorisés sur ALLOWED_HOSTS = ['*']

Stephen Mwangi Wanjohi
la source
4
Ne répétez pas la réponse acceptée. Supprimer ceci pour garder le forum propre
WoodChopper
ne répondez pas comme ça, commentez
Adnan Abdollah Zaki