2017-05-17 7 views
0

Django RESTフレームワーク(DJRF)のPOSTに適用するテールサイズUploadHandler(SDFUploadHandler)があります。しかし、やって: テールマウントアップロードハンドラを使用したDjango Restフレームワークでは、csrfトークンで問題が発生します。

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

は本当に限りDJRFがトークンCSRFをチェックし、読み取りが開始された後、アップロード・ハンドラを変更するには遅すぎるので、私は https://stackoverflow.com/a/30875830/214742から理解としては動作しません。私は 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をフックするアプローチに行きました。

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) 

これは何もデータを改ざんしていないし、私のアップロードハンドラが代わりに使用されているので、十分に早くなっているようだ:APIViewクラスは、私は私のサブクラスでオーバライドしてみましたinitialize_requestという名前のメソッドを持っているが判明。

関連する問題