DjangorestFramework Загрузить файл файла 'CSRF Проверка не удалась'

StackOverflow https://stackoverflow.com//questions/22077384

Вопрос

Я использую 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)
.

API / URLS.PY содержит эту строку:

url(r'^files/', 'api.views.FileUploadView'),
.

Но когда я пытаюсь загрузить файл, я получаю сообщение о том, что:

'CSRF verification failed. Request aborted'
'Reason given for failure: CSRF cookie not set'
.

Когда я попробую эту команду curl:

curl -XPUT http://localhost:8000/files/ -H 'Authorization: Bearer some_access_token' -F filedata=@localfile.txt
.

Вот мои rest_framework по умолчанию:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.OAuth2Authentication',
    )
}
.

Это было полезно?

Решение

1) В моем исходном коде я ожидал, что параметр имени файла будет наступить на мой взгляд, но я не разделял его из URL в URLS.PY.Это должно было посмотреть что-то подобное:

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

2) Я также не предоставил APIIIVEW в качестве представления.Если вы заметите выше, я специально вызываю метод .As_View ().

с вышеуказанным фиксированным и внедренным постом вместо того, чтобы мой код работает как ожидалось.Вот мой нынешний apiiview:

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)
.

Другие советы

на Документация Django Read Pracess , «Если вы используете SessionAuthenticentication, вам нужно включить допустимые токены CSRF для любого сообщения, поставьте, патч или удаление операций.

Для того, чтобы сделать запросы AJAX, вам необходимо включить токен CSRF в заголовок HTTP, как описано в Django Documentation ."

В качестве альтернативы вы можете попытаться сделать этот вид CSRF освобожден :

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt

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

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(FileUploadView, self).dispatch(request, *args, **kwargs)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top