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)
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
WSGIScriptAlias /rz /usr/local/share/rz/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())
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.
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.
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.