61 votes

Débogage d'une erreur de requête incorrecte Apache / Django / WSGI (400)

Mon simple Django app a bien fonctionné en mode debug (manage.py runserver), et travaille sous la WSGI+Apache sur ma boîte de dev, mais quand j'ai poussé à l'EC2 j'ai commencé à recevoir intermittente (10-80% du temps) les erreurs d' Bad Request (400) pour toutes les Url j'essaie de vue (que ce soit dans mon application ou dans l'admin de Django.

Où puis-je trouver les informations de débogage à ce sujet? Rien ne s'affiche en /var/log/apache2/error.log, même avec des LogLevel=info. J'ai vérifié les versions, connecté à la Demande de l'environnement (cf. ModWSGI de Débogage Conseils) et ne vois pas de grandes différences.

La seule pensée que j'ai eu est, je suis en utilisant le mod_wsgi de Ubuntu 12.04 (libapache2-mod-wsgi 3.3-4build1) qui a été construit contre Python 2.7.1; j'ai Python 2.7.3. Et Django est de 1,6, ce qui est plus récent que le Ubuntu version Précise. J'hésite à commencer la construction de paquets à partir des sources, car il est difficile à nettoyer et ces paraître mineurs, changements de version...

Je vous remercie pour votre aide.

(Pour référence, voici la config d'Apache et de WSGI apps)

De configuration d'Apache (000-default)

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

rz.Application 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())

106voto

teewuane Points 1383

Ajoutez le paramètre ALLOWED_HOSTS à votre settings.py comme si ...

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

J'ai eu ce même problème et j'ai trouvé la réponse ici dans la documentation

9voto

Yuji 'Tomita' Tomita Points 46106

Si vous avez bien défini ALOWED_HOSTS - assurez-vous que votre nom d'hôte ne contient pas de traits de soulignement. C'est techniquement illégal.

Je devais imprimer diverses fonctions et cela se résumait à cette regex qui échouait à détecter un domaine dans django.http

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

Et en effet, mon domaine avait un trait de soulignement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X