with mod_wsgi how and python django apache mod-wsgi django-wsgi

python - mod_wsgi - Depuración de Apache/Django/WSGI Error de solicitud incorrecta(400)



how to use django with apache and mod_wsgi (3)

Agregue la configuración ALLOWED_HOSTS a su settings.py como ...

ALLOWED_HOSTS = [ ''.example.com'', # Allow domain and subdomains ''.example.com.'', # Also allow FQDN and subdomains ]

Tuve el mismo problema y encontré la respuesta aquí en los documentos

actualización: django 1.6 documentos ya no están en línea, actualicé el enlace para ir a la configuración de django 1.7 para ALLOWED_HOSTS .

Mi sencilla aplicación Django funcionaba bien en el modo de depuración ( manage.py runserver ), y funciona bajo WSGI + Apache en mi cuadro dev, pero cuando presioné EC2 comencé a recibir errores intermitentes (10-80% del tiempo) de Bad Request (400) para cualquier URL que trate de ver (ya sea en mi aplicación o en el administrador de Django).

¿Dónde puedo encontrar información de depuración sobre esto? No aparece nada en /var/log/apache2/error.log , incluso con LogLevel=info . He comprobado las versiones, he registrado el entorno de solicitud ( consulte las sugerencias de depuración de ModWSGI ) y no veo diferencias importantes.

La única idea que me quedaba es que estoy usando el mod_wsgi de Ubuntu 12.04 (libapache2-mod-wsgi 3.3-4build1) que fue desarrollado contra Python 2.7.1; Tengo Python 2.7.3. Y Django es 1.6, que es más nuevo que la versión Ubuntu Precise. Dudo en comenzar a crear paquetes desde la fuente, ya que es muy difícil de limpiar y estos parecen cambios menores en la versión ...

Gracias por tu ayuda.

(Como referencia, aquí están las aplicaciones Apache config y WSGI)

Configuración de Apache (000-predeterminado)

<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www WSGIScriptAlias /rz /usr/local/share/rz/rz.wsgi ...

Aplicación rz.WSGI

import os import sys import django.core.handlers.wsgi import pprint path = ''/usr/local/share/rz'' if path not in sys.path: sys.path.insert(0, path) os.environ[''DJANGO_SETTINGS_MODULE''] = ''rz.settings'' class LoggingMiddleware: def __init__(self, application): self.__application = application def __call__(self, environ, start_response): errors = environ[''wsgi.errors''] pprint.pprint((''REQUEST'', environ), stream=errors) def _start_response(status, headers, *args): pprint.pprint((''RESPONSE'', status, headers), stream=errors) return start_response(status, headers, *args) return self.__application(environ, _start_response) application = LoggingMiddleware(django.core.handlers.wsgi.WSGIHandler())


Esta no es una solución , pero con fines de depuración, puede establecer la configuración ALLOWED_HOSTS en su settings.py como esta

ALLOWED_HOSTS = [''*'']

Definitivamente debería funcionar. Si no, al menos sabrá que el problema no es que Django niegue el acceso a la url dada.


Si definitivamente ha configurado ALOWED_HOSTS , asegúrese de que su nombre de host no contenga guiones bajos. Es técnicamente ilegal.

Tuve que imprimir varias funciones y se redujo a esta expresión regular no detectar un dominio en django.http

host_validation_re = re.compile(r"^([a-z0-9.-]+|/[[a-f0-9]*:[a-f0-9:]+/])(:/d+)?$")

Y, de hecho, mi dominio tenía un guión bajo.