Django da una solicitud incorrecta (400) cuando DEBUG = False

254

Soy nuevo en django-1.6. Cuando ejecuto el servidor django con DEBUG = True, funciona perfectamente. Pero cuando cambio DEBUGa Falseen el archivo de configuración, el servidor se detuvo y se da el siguiente error en el símbolo del sistema:

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

Después de cambiar ALLOWED_HOSTSa ["http://127.0.0.1:8000",], en el navegador me sale el error:

Bad Request (400)

¿Es posible ejecutar Django sin modo de depuración?

codeimplementer
fuente
Una cosa para recordar: no agregue 'http' o 'https' enALLOWED_HOSTS
shellbye

Respuestas:

415

La ALLOWED_HOSTSlista debe contener nombres de host totalmente calificados , no URL. Deja de lado el puerto y el protocolo. Si está utilizando 127.0.0.1, también agregaría localhosta la lista:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

También puede usar *para hacer coincidir cualquier host:

ALLOWED_HOSTS = ['*']

Citando la documentación:

Los valores en esta lista pueden ser nombres completamente calificados (p 'www.example.com'. Ej. ), En cuyo caso se compararán exactamente con el encabezado de la solicitudHost (sin distinción entre mayúsculas y minúsculas, sin incluir el puerto ). Un valor que comienza con un período puede ser utilizado como un comodín subdominio: '.example.com'coincidirá example.com, www.example.comy cualquier otro subdominio de example.com. Un valor de '*'coincidirá con cualquier cosa; en este caso, usted es responsable de proporcionar su propia validación del Hostencabezado (tal vez en un middleware; de ​​ser así, este middleware debe aparecer primero MIDDLEWARE_CLASSES).

El énfasis en negrita es mío .

La respuesta de estado 400 que obtiene se debe a una SuspiciousOperationexcepción que se genera cuando el encabezado del host no coincide con ningún valor en esa lista.

Martijn Pieters
fuente
3
Gracias, funciona, pero cuando configuro False, surge un problema, porque todos los archivos estáticos se muestran como 404. No podía entender por qué no se encuentra
MegaBytes
@MegaBytes: lo siento, no sé qué podría ser eso.
Martijn Pieters
1
¿Me puede sugerir cómo hacerlo, porque mi proyecto está en producción?
MegaBytes
Una vez más, no tengo ni idea de lo que está configurando False. ¿Quizás podrías publicar una nueva pregunta?
Martijn Pieters
99
@MegaBytes Cuando DEBUG es False, todos los archivos estáticos se sirven desde STATIC_ROOT, por ./manage.py collectstaticlo que probablemente sea suficiente.
Blackeagle52
6

Para mí, recibí este error al no establecerlo USE_X_FORWARDED_HOSTen verdadero. De los documentos:

Esto solo debe habilitarse si un proxy que establece este encabezado está en uso.

Mi servicio de alojamiento escribió explícitamente en su documentación que esta configuración debe usarse, y recibo este error 400 si lo olvido.

Keith
fuente
¿Es esto necesario si ALLOWED_HOSTS = ['*']?
Mike Stoddart el
1
Creo que ALLOWED_HOSTS bloquea todo el host. USE_X_FORWARDED_HOST solo determina si se usa un encabezado HTTP.
Keith el
3

Tuve el mismo problema y lo solucioné configurando ALLOWED_HOSTS = ['*']y para resolver el problema con las imágenes estáticas, debe cambiar las rutas virtuales en la configuración del entorno de esta manera:

                Directorio de ruta virtual

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

Espero que te ayude.

PD: perdón por mi mal inglés.

Jorge
fuente
2

Tuve el mismo problema y ninguna de las respuestas resolvió mi problema, para resolver una situación como esta es mejor habilitar el registro agregando la siguiente configuración a settings.pytemporal

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

e intenta hacerlo tail -f /tmp/debug.log. y cuando vea su problema, puede manejarlo mucho más fácilmente que la depuración ciega.

Mi problema estaba a punto de

Encabezado HTTP_HOST no válido: 'pt_web: 8000'. El nombre de dominio proporcionado no es válido de acuerdo con RFC 1034/1035.

y resolverlo agregando proxy_set_header Host $host;al archivo de configuración de Nginx y habilitando el reenvío de puertos USE_X_FORWARDED_PORT = Trueen el settings.py(es porque en mi caso he escuchado solicitar en Nginx en el puerto 8080y pasarlo al gunipuerto8000

Yuseferi
fuente
Gracias por compartir. Para mi caso en prod, después de agregar LOGGING = ..., veo el error "ValueError: falta la entrada de manifiesto de archivos estáticos para ... css". Luego uso "python manager.py collectstatic" como se mencionó anteriormente en @ Blackeagle52, el error 500 (también puede ser 400 error en mi desarrollador local) está resuelto.
zhihong
1

Para mí, ya tengo xampp en 127.0.0.1 y django en 127.0.1.1 y seguí intentando agregar hosts

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

y recibí el mismo error o (400) solicitud incorrecta ingrese la descripción de la imagen aquí

entonces cambio la url a 127.0.1.1:(the puerto usado) / project y listo!

tienes que verificar cuál es tu dirección de red virtual, para mí, ya que uso bitnami django stack 2.2.3-1 en Linux, puedo verificar qué puerto está usando django. si tienes un error (400 solicitudes incorrectas) entonces supongo que django en una red virtual diferente ... buena suerte ingrese la descripción de la imagen aquí

Muhamed Noaman
fuente
0

Con DEBUG = Falsesu archivo de configuración, también necesita configurar la lista ALLOWED_HOST. Intenta incluirALLOWED_HOST = ['127.0.0.1', 'localhost', 'www.yourdomain.com']

De lo contrario, es posible que reciba un error de solicitud incorrecta (400) de django.

Abhishek Lodha
fuente
0

Intente ejecutar su servidor con --seguro de la siguiente manera:

python manage.py runserver --insecure

Alberto
fuente
0

Primero tuve que detener el servidor apache.

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

Eso resolvió mi problema además de editar el settings.pyarchivo ' '

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

Ivanovic
fuente
-4

Navegue a la configuración y localice el archivo base.py Establezca los hosts permitidos en ALLOWED_HOSTS = ['*']

Stephen Mwangi Wanjohi
fuente
44
No repita la respuesta aceptada. Eliminar esto para mantener limpio el foro
WoodChopper
no responda así, coméntelo
Adnan Abdollah Zaki