2015-09-04 8 views
3

Я разработал простой веб-сервис, но не использовать пост с Джанго Rest Framework, как он жалуется на CSRF:Джанго Rest Framework жалуясь CSRF

«деталь»: «CSRF Ошибки: CSRF печенье не установлена. "

Удаление api_view декоратора делает остановить сообщение от появляться, но тогда я не буду в состоянии получить доступ к request.data. Я думаю, что api_view проверяет CSRF, хотя я добавил декоратор csrf_exempt.

Это мое мнение:

@permission_classes((IsAuthenticated,)) 
@csrf_exempt 
@api_view(['POST']) 
def get_stats(request): 
    """ 
    Returns the stats available. 
    """ 

    user = request.user 

    if request.method == 'POST': 
     serializer = StatsRequestSerializer(data=request.data) 
     stats_request = serializer.data 
     return JSONResponse(stats_request) 

      #serializer = QuizSerializer(user.quizes.all(), many=True) 
      #return JSONResponse(serializer.data) 

    response = ActionResponse(status='error', error='Invalid request') 
    serializer = ActionResponseSerializer(response) 
    return JSONResponse(serializer.data, status=400) 

Это моя модель:

class StatsRequest(models.Model): 
    """ 
    A model which describes a request for some stats for specific users. 
    """ 

    start_date = models.DateField() 
    end_date = models.DateField() 

и это мой запрос POST:

{"start_date" : "1992-01-15", "end_date" : "1992-01-15" } 

Любые идеи?

Подробнее:

AUTHENTICATION_BACKENDS = (
    'social.backends.facebook.FacebookOAuth2', 
    'social.backends.google.GoogleOAuth2', 
    'django.contrib.auth.backends.ModelBackend' 
) 
+0

С каждым запросом POST вам необходимо отправить маркер crsf. Есть еще информация об этом в документах https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#csrf-ajax – Hinrich

+2

@Hinrich: это точка декоратора 'csrf_exempt': обход csrf validation, cf https://docs.djangoproject.com/en/1.8/ref/csrf/#django.views.decorators.csrf.csrf_exempt –

+0

Вы пробовали декодер 'api_view' без' csrf_exempt'? Какую аутентификацию вы используете? – Alasdair

ответ

0

Пожалуйста, смотрите по этой ссылке:
Disabling CSRF checking in Django

+0

Спасибо, но проблема по-прежнему идет, любые идеи почему? как сказано, что api_view - это тот, кто создает проблемы здесь. – Shynet

0

Таким образом, после попытки выяснить это в течение нескольких часов, я, наконец, сделал это. Отслеживание исходного кода DRF и Django заставляет меня полагать, что мне нужно найти обходное решение для этого, поскольку проверка CSRF производится явно, даже если выключена, вероятно, проверка CSRF выполняется в декораторе api_view. Так что я просто создал свой собственный декоратора:

from functools import wraps 
from django.utils.decorators import available_attrs, decorator_from_middleware 

def csrf_clear(view_func): 
    """ 
    Skips the CSRF checks by setting the 'csrf_processing_done' to true. 
    """ 

    def wrapped_view(*args, **kwargs): 
     request = args[0] 
     request.csrf_processing_done = True 
     return view_func(*args, **kwargs) 

    return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view) 

и мой взгляд с новым декоратора:

@csrf_clear 
@api_view(['POST']) 
@permission_classes((IsAuthenticated,)) 
def get_stats(request): 
    """ 
    Returns the stats available. 
    """ 

    user = request.user 

    if request.method == 'POST': 
     serializer = StatsRequestSerializer(data=request.data) 

     if serializer.is_valid(): 
      stats_request = serializer.data 
      return JSONResponse(stats_request) 

      #serializer = QuizSerializer(user.quizes.all(), many=True) 
      #return JSONResponse(serializer.data) 

    response = ActionResponse(status='error', error='Invalid request') 
    serializer = ActionResponseSerializer(response) 
    return JSONResponse(serializer.data, status=400) 
0

urls.py

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

]

views.py

from django.views.decorators.csrf import csrf_exempt 
from rest_framework.views import APIView 
class SnippetList(APIView): 
    @csrf_exempt 
    @need_post_parameters([PARAM_MESSAGE_OBJ]) 
    def post(self, request, *args, **kwargs): 
     data = request.POST.get(PARAM_MESSAGE_OBJ) 

     try: 
      message_obj = json.loads(data) 
     except Exception as e: 
      return HttpResponseBadRequest(error_json("Could not parse JSON")) 

http://www.chenxm.cc/post/509.html

Смежные вопросы