2016-08-09 46 views
0

Also ich habe ein Modell, dass ich eine PATCH über eine Sicht mache, die unter Umständen mein Objekt so mutieren kann, dass der Anrufer nicht darf um es weiter zu mutieren.Ist es möglich, Berechtigungen während einer Anfrage zu behalten?

Meine Erlaubnis Klasse sieht ungefähr so ​​aus:

class MyPermission(BasePermission): 

    def has_object_permission(self, request, view, obj): 
     if request.user.has_perm("can_change_when_not_done") and obj.status != "done": 
      return True 
     return super(MyPermission, self).has_object_permission(request, view_obj) 

Dies funktioniert wie erwartet.

Es scheint jedoch, dass, wenn ich das Objekt "fertig" patch (zB {'status': 'done'} in der Nutzlast), passiert es durch einen Serializer auf dem Weg zurück, die eine andere Berechtigungsprüfung, die eine 403 ergibt, seit der Objekt ist jetzt "fertig". Ich möchte immer noch eine 200 und eine serialisierte Ansicht von dem, was das Objekt jetzt aus dieser Anfrage aussieht. Zukunft mutiert Anforderungen in einer 403.

Einstellen des Objekts zu schreibgeschützt unter „sicheren“ Methoden führen sollte (zum Beispiel GET) tut nicht Hilfe, da der ursprüngliche Antrag ist immer noch ein PATCH.

Gibt es einen einfachen Weg, um das zu erreichen, was ich will, oder nähere ich mich diesem Fehler?

Antwort

0

So stellt sich heraus, dass ich mich geirrt habe. Permission-Checks passieren nur einmal und sehr früh während einer Anfrage.

In meinem Fall war das Problem, dass mit dem Signalhandler die PATCH Anfrage durchgeführt. Für mich zu der Zeit unbekannt, gab es einen anderen Signalhandler auf diesem Modell, der irgendwann instance.save() tat. Dies führte dazu, dass mein Signal-Handler zweimal lief, was bei der zweiten Anfrage offensichtlich zu einem 403.

führte. Nach der Kombination der Signal-Handler (kein Grund für beide existieren), läuft alles einwandfrei. Hoffe, das kann jemandem in der Zukunft helfen!