DjangoRestFramework 上传文件“CSRF 验证失败”

arn*_*rnm 6 python django oauth oauth-2.0 django-rest-framework

我正在使用 DjangoRestFramework 来制作 API。目前我有 OAuth2 身份验证工作,这意味着我可以生成一个有效的访问令牌来使用 API。

如何上传用户文件?我需要上传一个文件并将其与上传它的用户相关联。

我目前正在尝试这样做

api/views.py:

class FileUploadView(APIView):
    parser_classes = (FileUploadParser,)

    def put(self, request, filename, format=None):
        file_obj = request.FILES['file']
        # do stuff
        return Response(status=204)
Run Code Online (Sandbox Code Playgroud)

api/urls.py 包含这一行:

url(r'^files/', 'api.views.FileUploadView'),
Run Code Online (Sandbox Code Playgroud)

但是当我尝试上传文件时,我收到一条错误消息:

'CSRF verification failed. Request aborted'
'Reason given for failure: CSRF cookie not set'
Run Code Online (Sandbox Code Playgroud)

当我尝试这个 curl 命令时:

curl -XPUT http://localhost:8000/files/ -H 'Authorization: Bearer some_access_token' -F filedata=@localfile.txt
Run Code Online (Sandbox Code Playgroud)

这是我的 REST_FRAMEWORK 默认值:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.OAuth2Authentication',
    )
}
Run Code Online (Sandbox Code Playgroud)

arn*_*rnm 6

1) 在我的原始代码中,我期望文件名参数进入我的视图,但我没有从 urls.py 中的 url 中解析它。它应该看起来像这样:

url(r'^uploads/(?P<filename>[\w.]{0,256})/$', views.UploadsView.as_view()),

2)我也没有提供 APIView 作为视图。如果你注意到上面我特意调用了 .as_view() 方法。

通过上述修复和实现 POST 而不是 PUT 我的代码按预期工作。这是我当前的 APIView:

class UploadsView(APIView):

    parser_classes = (FileUploadParser,)
    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request, format=None):
        file_obj = request.FILES['file']
        print("FILE OBJ: ", file_obj)
        return Response(status=201)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我遇到了同样的问题,忘了做`.as_view()`。 (2认同)