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!
InformationsquelleAutor T. Stone | 2010-02-19
Schreibe einen Kommentar