web-dev-qa-db-fra.com

Django donne une mauvaise demande (400) lorsque DEBUG = False

Je suis nouveau sur Django-1.6. Lorsque je lance le serveur Django avec DEBUG = True, il fonctionne parfaitement. Mais lorsque je remplace DEBUG par False dans le fichier de paramètres, le serveur s’est arrêté et l’erreur suivante apparaît sur la commande Invite:

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

Après avoir changé ALLOWED_HOSTS en ["http://127.0.0.1:8000",], le message d'erreur suivant s'affiche:

Bad Request (400)

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

223
codeimplementer

La liste ALLOWED_HOSTS devrait contenir les noms complets noms d’hôtes, pas urls. Laissez 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 tout hôte:

ALLOWED_HOSTS = ['*']

Citer la documentation:

Les valeurs de cette liste peuvent être des noms complets (par exemple, 'www.example.com'), auquel cas elles seront appariées avec l'en-tête Host de la requête exactement (sans distinction de casse, sans le port). Une valeur commençant par un point peut être utilisée comme caractère générique de sous-domaine: '.example.com' correspond à example.com, www.example.com et à tout autre sous-domaine de example.com. Une valeur de '*' correspondra à n'importe quoi; dans ce cas, vous êtes responsable de fournir votre propre validation de l'en-tête Host (peut-être dans un middleware; dans ce cas, ce middleware doit être répertorié en premier dans MIDDLEWARE_CLASSES).

Gras accent mien.

La réponse du statut 400 que vous obtenez est due à une exception SuspiciousOperation qui est générée lorsque votre en-tête d’hôte ne correspond à aucune des valeurs de cette liste.

376
Martijn Pieters

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

Chemin virtuel Répertoire

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

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

PD: désolé pour mon mauvais anglais.

3
Jorge

Pour moi, j'ai eu cette erreur en ne mettant pas USE_X_FORWARDED_Host à true. De la docs: 

Cela ne devrait ê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 soit utilisé, et j'obtiens cette erreur 400 si je l'oublie. 

3
Keith

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 de cette manière, il est préférable d'activer la journalisation en ajoutant la configuration suivante à settings.py temporaire

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 en 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 RFC 1034/1035.

et résolvez-le en ajoutant proxy_set_header Host $Host; au fichier de configuration Nginx et en activant la redirection de port par USE_X_FORWARDED_PORT = True dans le settings.py (c'est parce que dans mon cas, j'ai écouté une requête dans Nginx sur le port 8080 et le transmettre à guni sur le port 8000

1
Yusef Mohamadi

Avec DEBUG = False dans votre fichier de paramètres, vous devez également configurer la liste ALLOWED_Host . Essayez d'inclure ALLOWED_Host = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

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

0
Abhishek Lodha

Pour moi comme j’ai déjà xampp sur 127.0.0.1 et Django sur 127.0.1.1 et j’essayais 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 enter image description here

donc je change l'URL à 127.0.1.1:(le port utilisé)/projet et le tour est joué!

vous devez vérifier quelle est votre adresse de réseau virtuel. Pour moi, j’utilise bitnami Django stack 2.2.3-1 sous Linux, je peux vérifier quel port Django utilise. si vous avez une erreur (400 requêtes incorrectes), alors je suppose que Django sur un réseau virtuel différent .. bonne chance enter image description here

0
Muhamed Noaman