2017-05-17 1 views
0

Ich habe eine maßgeschneiderte UploadHandler (SDFUploadHandler), die ich auf einen POST in Django REST-Framework (DJRF) anwenden möchte. Allerdings tun:Django Rest Framework mit maßgeschneiderten Uploadhandler gibt Probleme mit csrf Token

request.upload_handlers.insert(0, SDFUploadHandler(request, dataset))

nicht wirklich so weit arbeiten, wie ich von https://stackoverflow.com/a/30875830/214742 verstehen, weil die DJRF die csrf Token überprüft und, wenn die Lese gestartet wurde es zu spät ist Upload-Handler zu ändern. Ich fand auch How do I modify the file upload handlers in a class based View with CSRF middleware?, die eine nette Weise zeigt, die automatische csrf-Tokenüberprüfung zu umgehen und es dann manuell zu tun, was bedeuten würde, dass ich meinen UploadHandler laufen lassen könnte. Das Problem ist, dass meine App eine Überwachung benötigt, daher muss ich wissen, welcher Benutzer die Anfrage tatsächlich gestellt hat und da ich die Authentifizierung deaktiviert habe, damit dies funktioniert, habe ich keine request.user mehr. Kann ich die Authentifizierung auch manuell durchführen, nachdem ich meinen Upload-Handler hinzugefügt habe? Oder kann der UploadHandler irgendwie früher eingebunden werden?

Außerdem ist es nicht genug für mich, dass eine Lösung nur mit der Django-Standardauthentifizierung funktioniert, aber sie muss allgemeiner sein, da ich auch die Keycloak-basierte Authentifizierung verwenden werde.

Antwort

0

Also ging ich mit dem Ansatz des Einhängens in den UploadHandler in einem früheren Schritt. Stellt sich heraus, die APIView Klasse hat eine Methode namens initialize_request, die ich versuchte, in meine Unterklasse außer Kraft zu setzen:

class RestDatasets(APIView): 

permission_classes = (IsAuthenticated,) 
parser_classes = (MultiPartParser,) 
serializer_class = DatasetSerializer 

def initialize_request(self, request, *args, **kwargs): 
    if request.method == 'POST' : 
     request.currentDataset = DatasetModel.objects.create() 
     request.upload_handlers.insert(0, SDFUploadHandler(request, request.currentDataset)) 
    return APIView.initialize_request(self, request, *args, **kwargs) 

Dies scheint früh genug gewesen zu sein, so dass nichts mit den Daten und meine Upload-Handler verwendet wird stattdessen manipuliert.

Verwandte Themen