2017-05-17 35 views
0

我有一個定製的UploadHandler(SDFUploadHandler),我想申請到一個POST在Django REST框架(DJRF)。然而,這樣做的:Django resto框架與tailormade uploadhandler提供的問題與csrf令牌

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

並沒有真正據我從https://stackoverflow.com/a/30875830/214742理解,因爲DJRF檢查CSRF令牌,一旦讀取已經開始爲時已晚改變上傳處理工作。我還發現How do I modify the file upload handlers in a class based View with CSRF middleware?它顯示了一個很好的方法來繞過自動csrf標記檢查,然後手動執行它,這意味着我可以運行我的UploadHandler。問題是我的應用程序需要審計,所以我需要知道哪個用戶實際提出了請求,並且因爲我禁用了身份驗證才能使其工作,所以我不再有request.user。在添加我的上傳處理程序後,是否可以通過簡單的方式手動進行身份驗證?或者UploadHandler能否以某種方式被掛鉤?

此外,對於我來說,一個解決方案只適用於Django標準身份驗證是不夠的,但它需要更通用,因爲我也將使用基於Keycloak的身份驗證。

回答

0

因此,我最終在前面的步驟中使用了UploadHandler掛鉤的方法。原來,APIView類有一個名爲initialize_request方法,我想在我的子類此改變:

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) 

這似乎已經足夠早,所以一切都沒有用數據篡改和我的上傳處理程序來代替。