web-dev-qa-db-fra.com

Erreur de débogage d'Apache / Django / WSGI (400)

Mon simple Django a bien fonctionné en mode débogage (manage.py runserver), Et fonctionne sous WSGI + Apache sur ma boîte de développement, mais quand j'ai poussé vers EC2, j'ai commencé à recevoir des intermittents (10 -80% du temps) des erreurs de Bad Request (400) pour toutes les URL que j'essaie d'afficher (que ce soit dans mon application ou dans l'administration Django.

Où puis-je trouver des informations de débogage à ce sujet? Rien n'apparaît dans /var/log/Apache2/error.log, Même avec LogLevel=info. J'ai vérifié les versions, enregistré l'environnement de demande (cf. ModWSGI Debugging Tips ) et je ne vois aucune différence majeure.

La seule pensée que j'avais était, j'utilise le mod_wsgi d'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 1.6, qui est plus récent que la version Ubuntu Precise. J'hésite à commencer à construire des paquets à partir des sources car il est si difficile à nettoyer et à cela ressemble à des changements de version mineurs ...

Merci pour votre aide.

(Pour référence, voici la configuration Apache et les applications WSGI)

Configuration Apache (000 par défaut)

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

application 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())
60
mrisher

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

mise à jour: Django 1.6 les documents ne sont plus en ligne, j'ai mis à jour le lien pour aller aux Django 1.7 documents pour ALLOWED_HOSTS réglage.

105
teewuane

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

J'ai dû imprimer diverses fonctions et cela se résumait à cette expression régulière qui ne détectait pas 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 contenait un trait de soulignement.

9

C'est pas une solution, mais à des fins de débogage , vous pouvez définir le paramètre ALLOWED_HOSTS dans votre settings.py comme ceci

ALLOWED_HOSTS = ['*']

Cela devrait certainement fonctionner. Sinon, vous saurez au moins que le problème n'est pas Django refusant l'accès à l'url donnée.

0
user3770635