我有一个量身定制的UploadHandler(SDFUploadHandler
),我想将其应用于Django REST框架(DJRF)中的POST。但是,做:
request.upload_handlers.insert(0, SDFUploadHandler(request, dataset))
并没有真正起作用,因为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 :(得分: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)
这似乎已经足够早,所以没有任何篡改数据,而是使用我的上传处理程序。