使用定制的uploadhandler的Django休息框架给出了csrf令牌

时间:2017-05-17 14:45:44

标签: django-rest-framework

我有一个量身定制的UploadHandler(SDFUploadHandler),我想将其应用于Django REST框架(DJRF)中的POST。但是,做:

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的身份验证。

1 个答案:

答案 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)

这似乎已经足够早,所以没有任何篡改数据,而是使用我的上传处理程序。