DjangorestFramework Загрузить файл файла 'CSRF Проверка не удалась'
-
23-12-2019 - |
Вопрос
Я использую 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)
.