Cela marche:
from django.core.exceptions import DisallowedHost
def index(request):
try:
# Do some stuff
except DisallowedHost:
return render(request, 'something.html')
Mais comment puis-je attraper l'erreur: django.http.request.DisallowedHost ?
J'ai essayé et cela ne fonctionne pas:
def index(request):
try:
# Do some stuff
except:
return render(request, 'something.html')
3 Réponses :
Vous pouvez utiliser un middleware personnalisé pour cela.
Pour cela, créez un middleware personnalisé en sous-classant la CommonMiddleware - (Doc) et remplacez la méthode process_request(...) - (Doc)
# settings.py
MIDDLEWARE = [
# other middleware
'some_place.some_module.CustomCommonMiddleware', # add this
'django.middleware.common.CommonMiddleware', # Remove this
# other middleware
] Ensuite, remplacez le middleware django.middleware.common.CommonMiddleware par la classe personnalisée nouvellement créée dans MIDDLEWARE - (Doc) settings comme,
# some_place/some_module.py
from django.middleware.common import CommonMiddleware
from django.core.exceptions import DisallowedHost
from django.http.response import HttpResponse
from django.shortcuts import render
class CustomCommonMiddleware(CommonMiddleware):
def process_request(self, request):
try:
return super().process_request(request)
except DisallowedHost:
return render(request, 'something.html')
Veuillez ne pas remplacer le middleware ou faire d'autres choses bizarres. C'est très simple: DisallowedHost () est get_host() par la première chose qui appelle get_host() sur un objet de requête. En règle générale, il s'agit d'un middleware, car le faire trop tôt dans le cycle de demande / réponse rendrait impossible la désactivation ou la personnalisation.
Alors, injectez d'abord votre middleware personnalisé dans la chaîne et court-circuitez les choses là-bas:
MIDDLEWARE = [
"main.middleware.FriendlyDisallowedHost",
# ... rest of middleware
]
réglages:
# File: main.middleware
from django.shortcuts import redirect
from django.core.exceptions import DisallowedHost
class FriendlyDisallowedHost:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
try:
checkhost = request.get_host()
except DisallowedHost:
return redirect("http://localhost/")
return self.get_response(request)
Étant donné que Django interceptera la requête et lèvera cette exception avant même d'appeler votre vue, vous devez utiliser une vue d'erreur personnalisée pour gérer ces types d'erreurs remplaçant les vues d'erreur par défaut.
Dans la vue de votre application, écrivez le gestionnaire que vous souhaitez gérer DisallowedHost
handler400 = 'mysite.views.my_bad_request_handler'
Ensuite, dans votre URLConf, définissez le gestionnaire 400 sur votre vue personnalisée:
from django.views.defaults import bad_request as default_bad_request
from django.core.exceptions import DisallowedHost
from django.http import HttpResponse
def my_bad_request_handler(request, exception=None, **kwargs):
if isinstance(exception, DisallowedHost):
return HttpResponse("This server is not configured for this hostname", status=400)
# if it's some other kind of bad request, use Django's default handler
return default_bad_request(request, exception, **kwargs)
Voir aussi: exception SuspiciousOperation et vue 400 demandes incorrectes .
Pourquoi voudriez-vous attraper ça? Vous savez que si vous ajoutez '*' dans vos allowd_hosts dans les paramètres, vous n'aurez pas cette exception?
@AmirAfianian Mon projet dessert de nombreux domaines. Quand quelqu'un pointe des serveurs sur nous mais ne met pas à jour le domaine dans l'application, je souhaite afficher un message d'erreur utile plutôt qu'un simple 500.
django.http.request.DisallowedHostest-django.http.request.DisallowedHostidentique àdjango.core.exceptions.DisallowedHost?