2014-04-02 6 views
6

Otrzymuję komunikat o błędzie "Nie ustawiono pliku CSRF cookie" podczas próby POST do prostej aplikacji testowej wykorzystującej framework REST Django. Próbowałem go z Django 1.4 i Django 1.6.2. Korzystam z frameworku Django REST v 2.3.13.Dlaczego otrzymuję komunikat "Nie ustawiono pliku cookie CSRF" podczas testu POST na Django REST?

Próbowałem użyć dekoratora @csrf_exempt, ale to nie pomaga.

Jest to bardzo prosta aplikacja, bez rejestracji użytkownika/zalogować itp

Jakieś pomysły dlaczego dostaję ten błąd?

Aktualizacja: Zaktualizowałem mój adres urls.py, jak pokazano poniżej, a teraz działa!

Oto mój kod:

urls.py

from django.conf.urls import patterns, url 

from quickstart import views 

urlpatterns = patterns('', 
    url(r'^api_add/$', views.api_add, name='api_add'), 
) 

views.py

from rest_framework import status 
from rest_framework.decorators import api_view 
from rest_framework.response import Response 

@api_view(['POST']) 
def api_add(request): 
    return Response({"test": 'abc'}) 

settings.py

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles',            
    'rest_framework', 
) 

post.sh

curl -X POST -H "Content-Type: application/json" -d ' 
{ 
    "name": "Manager", 
    "description": "someone who manages" 
}' http://127.0.0.1:8000/api_add/            

Odpowiedz

5

Użyj @csrf_exempt -decorator:

from django.views.decorators.csrf import csrf_exempt 

@api_view(['POST']) 
@csrf_exempt 
def api_add(request): 
    return Response({"test": 'abc'}) 

Aktualizacja: Jeśli nie musisz csrf -Sprawdza, usunięcia warstwy pośredniej. Znajdź numer MIDDLEWARE_CLASSES w settings.py i usuń 'django.middleware.csrf.CsrfViewMiddleware',.

+0

Próbowałem tego przed opublikowaniem mojego pytania. Powinienem powiedzieć. Wciąż dostaję ten sam błąd. – smithy

+0

Zaktualizowałem moją odpowiedź. Czy to jest rozwiązanie? – tjati

+2

Nie chciałem wyłączać ochrony CSRF, ponieważ niektórzy użytkownicy będą umieszczać formularze za pośrednictwem przeglądarki internetowej i dla nich chcę ochrony CSRF. Udało mi się uruchomić go, aktualizując mój urls.py ... – smithy

1

Rozwiązałem to tak:

@api_view(['POST']) 
@csrf_exempt 
def add(request): 
    .... 

do:

@csrf_exempt 
@api_view(['POST']) 
def add(request): 
    .....