2
votes

Django: handler403 ne fonctionne pas, mais 404 fonctionne

Voici le contenu de MyProj/urls.py

from django.shortcuts import render_to_response

def handler403(request, *args, **argv):
    print('Handler 403 was called!')
    u = request.user
    params = {
        'user': u,
    }
    response = render_to_response('403.html', params)
    response.status_code = 403
    return response

Comme vous pouvez le voir, les deux gestionnaires pointent vers la même vue, et la première, que je besoin le plus, ne fonctionne pas! Par exemple, les données de l'utilisateur d'un autre utilisateur sur / obj / 12 montrent la page 403 du navigateur par défaut:

[22 / janvier / 2019 08:39:14] "GET / obj / 12 HTTP / 1.1" 403 0

Mais le second fonctionne bien et affiche la page correcte (lorsque vous essayez d'accéder à des données non existantes à / obj / 768 ). Pourquoi et comment puis-je le résoudre?

Le mode de débogage est désactivé. Ma version Django est 2.0.6

Mise à jour.

Contenu du fichier handler403.py :

XXX

La chaîne Handler 403 a été appelée! n'est jamais imprimée lorsque j'essaye d'obtenir cette page.


2 commentaires

Pouvez-vous mettre à jour votre question avec votre vue personnalisée du gestionnaire d'erreurs?


@MohammadUmair terminé.


3 Réponses :


3
votes

Si c'est vraiment votre fichier handler403 (aka. handler403.py ), vous voudrez probablement

handler403 = 'general.views.handler403.handler403'

(donc un chemin en pointillé vers l'appelable réel).


2 commentaires

Non, cela n'aide pas, j'ai déjà essayé de spécifier le chemin de différentes manières. De plus, pour être précis, handler403 est stocké dans general.view.handler403 , et general.view .__ init__ a de .handler403 import handler403 .


Vous voudrez peut-être pirater une instrumentation de débogage (c'est-à-dire print s) dans votre copie locale de django.urls.resolvers.URLResolver # resolution_error_handler , pour voir ce qu'il essaie faire.



0
votes

handler403 doit pointer vers une vue

Essayez quelque chose comme ceci:

from general.views.handler403 import handler403

handler403 = handler403


0 commentaires

7
votes

Je suppose que vos vues renvoient un < code> django.http.HttpResponseForbidden au lieu de lever un django.core.exceptions.PermissionDenied exception.

Seule l'exception PermissionDenied est gérée par handler403, un HttpResponseForbidden est renvoyé tel quel.


1 commentaires

En effet! Merci beaucoup :)