подробно: Ошибка CSRF: токен CSRF отсутствует или неверен.

Я делаю RESTful API с помощью Tastypie, и когда я пытаюсь POST/PUT/DELETE запросить, он говорит:

"detail": "Ошибка CSRF: токен CSRF отсутствует или неверен.".

Он отлично работает с GET. Я читал различные темы на SO, говоря:

  • удалить куки
  • или используйте @csrf_exempt
  • или используйте @method_decorator(csrf_exempt)

но ни то, ни другое не сработало.

Как я могу обойти эту ошибку?

views.py

class SnippetList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)


    def post(self, request, *args, **kwargs):
        request._dont_enforce_csrf_checks = True
        print request.DATA
        return self.create(request, *args, **kwargs)

serializer.py

from django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES


class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

urls.py

from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = patterns('',
    url(r'^snippets/$', views.SnippetList.as_view()),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
)

urlpatterns = format_suffix_patterns(urlpatterns)

person PythonEnthusiast    schedule 03.02.2014    source источник
comment
Вы пробовали: csrfexemptmixin?   -  person mariodev    schedule 03.02.2014
comment
Что такое braces модуль?   -  person PythonEnthusiast    schedule 03.02.2014
comment
Я установил модуль braces с сайта github.com/brack3t/django-braces и повторно запустил POST-запрос, и он все еще дает мне ту же ошибку.   -  person PythonEnthusiast    schedule 03.02.2014
comment
Пробовали ли вы просто следовать инструкциям о том, как защитить csrf ваш запрос? Я имею в виду, зачем так стараться избегать этого?   -  person yuvi    schedule 03.02.2014
comment
@yuvi - я пробовал, но ничего не получилось.   -  person PythonEnthusiast    schedule 03.02.2014
comment
Можете ли вы поделиться этими попытками? Я думаю, что так было бы проще решить это. Кроме того, вы можете поделиться функцией create?   -  person yuvi    schedule 03.02.2014
comment
Как я уже сказал, я уже пытался украсить свою функцию сообщения @csrf_exempt и @method_decorator(csrf_exempt). Что нового я могу попробовать?   -  person PythonEnthusiast    schedule 03.02.2014
comment
@user1162512 user1162512 Вы уверены, что у вас нет набора файлов cookie csrf? Также вы тестировали запрос с помощью POSTMAN (Chrome)?   -  person mariodev    schedule 03.02.2014
comment
@mariodev- я стер свои куки, историю, все кешировал. Но все равно не работал. ПОЧТАЛЬОН? Позвольте мне найти о том, что это такое.   -  person PythonEnthusiast    schedule 03.02.2014
comment
Как использовать POSTMAN?   -  person PythonEnthusiast    schedule 03.02.2014
comment
@mariodev - Есть еще комментарии по этому поводу? Также. не могли бы вы предоставить свои предложения на stackoverflow.com /questions/21530021/ тоже.   -  person PythonEnthusiast    schedule 04.02.2014
comment
@user1162512 user1162512 Просто прочитайте о том, как использовать POSTMAN и сделать вызов API для вашего представления, не забудьте удалить файлы cookie на вашем сервере разработки.   -  person mariodev    schedule 04.02.2014
comment
кажется, что вы используете django-rest-framework, но не Tastypie   -  person SaulTigh    schedule 04.03.2014


Ответы (1)


Измените разрешения по умолчанию для rest_framework на AllowAny в settings.py.

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
...
}
person Void0xcc    schedule 09.07.2014
comment
У меня DEFAULT_PERMISSION_CLASSES установлено на rest_framework.permissions.IsAuthenticated, потому что я хочу разрешить доступ к API только зарегистрированным пользователям. Я ищу другой способ исправить эту вещь CSRF. - person nnyby; 09.10.2014
comment
то же самое с последним комментарием - person Javier Gutierrez; 06.04.2015