Erstellen von benutzerdefinierten Ausnahmen, Django reagiert auf
Für meine Website, die ich erstellt ein abstraktes Modell, das die Modell-Ebene Berechtigungen Lesen. Der Teil des Systems abgeschlossen ist und ordnungsgemäß funktioniert. Eine der Methoden, die permissioned model macht ist is_safe(user)
können manuell testen, ob ein Benutzer berechtigt ist, anzuzeigen, dass das Modell oder nicht.
Was ich tun möchte, ist, eine Methode, um die Wirkung von continue_if_safe
die man auf jeder model-Instanz, und anstatt einen booleschen Wert wie is_safe
es wäre zuerst zu testen, ob das Modell betrachtet werden kann oder nicht, dann im Falle von Falschen, würde es leiten den Benutzer auf die login-Seite, wenn Sie nicht bereits eingeloggt oder Rückgabe einen Fehler 403, wenn Sie angemeldet sind.
Ideale Verwendung:
model = get_object_or_404(Model, slug=slug)
model.continue_if_safe(request.user)
# ... remainder of code to be run if it's safe down here ...
Habe ich geguckt, wie die get_object_or_404 funktioniert, und es wirft ein Http404
Fehler, die scheint Sinn zu machen. Das problem ist jedoch, dass es offenbar nicht entspricht oder umleiten 403 Fehler. Was ist der beste Weg zu gehen über diese?
(non-working) continue_if_safe Methode:
def continue_if_safe(self, user):
if not self.is_safe(user):
if user.is_authenticated():
raise HttpResponseForbidden()
else:
raise HttpResponseRedirect('/account/')
return
Edit -- Die Lösung
Den code für die endgültige Lösung, falls andere "Stapler" brauchen Sie etwas Hilfe mit diesem:
In das Abstrakte Modell:
def continue_if_safe(self, user):
if not self.is_safe(user):
raise PermissionDenied()
return
Blick wird gefangen durch die middleware:
class PermissionDeniedToLoginMiddleware(object):
def process_exception(self, request, exception):
if type(exception) == PermissionDenied:
if not request.user.is_authenticated():
return HttpResponseRedirect('/account/?next=' + request.path)
return None
- Nutzung in den Blick (sehr kurz und knapp):
model = get_object_or_404(Model, slug=slug)
model.continue_if_safe(request.user)
- Vielen Dank für die Zeit nehmen, zu aktualisieren, die diese Frage mit details. Habe ich völlig falsch verstanden vorher. Ich weiß es zu schätzen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die forbidden (403) Fehler, Sie erhöhen könnte eine
PermissionDenied
Ausnahme (ausdjango.core.exceptions
).Für die Umlenkung Verhalten, es gibt keine eingebaute Möglichkeit, den Umgang mit, wie Sie in Ihrer Frage beschreiben. Sie schreiben, könnte eine custom-middleware, die fangen Ihre Ausnahme und leiten in
process_exception
.process_exception
auf eine middleware zurückHttpResponse
Habe ich eine kleine middleware, Rückkehr was auch immer Ihre Ausnahme-Klasse render-Methode gibt. Jetzt können Sie eigene exception werfen (mit render-Methoden) in Ihren Ansichten.
Und fügen Sie
django_excepted.middleware.ExceptionHandlingMiddleware
zu IhremMIDDLEWARE_CLASSES
.Django ärgerlich, hat dafür eine Lösung:
Den Sie verwenden möchten Dekorateure für diese. Nachschlagen
login_required
für ein Beispiel. Grundsätzlich ist der decorator wird Ihnen erlauben, überprüfen, prüfen die Sicherheit und dann zurückHttpResponseRedirect()
wenn Ihr nicht sicher.Ihr code wird am Ende der Suche etwas wie dieses: