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?


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.


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.


¿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.


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


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í


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.


0

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

python manage.py runserver --insecure


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']


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.