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.