在POST到Django REST框架时,为什么我会“设置CSRF cookie”?

时间:2014-04-02 13:16:50

标签: django django-rest-framework

我在尝试使用Django REST框架POST到一个简单的测试应用程序时收到错误“CSRF cookie not set”。我已经尝试过Django 1.4和Django 1.6.2。我正在使用Django REST框架v 2.3.13。

我尝试使用@csrf_exempt装饰器,但它没有帮助。

这是一个非常简单的应用程序,没有用户注册/登录等。

为什么我收到此错误的任何想法?

更新:我已更新了我的urls.py,如下所示,现在正在运行!!

这是我的代码:

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/                                               

4 个答案:

答案 0 :(得分:8)

使用@csrf_exempt - 装饰者:

from django.views.decorators.csrf import csrf_exempt

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

<强>更新 如果您从不需要csrf - 检查,请删除中间件。在MIDDLEWARE_CLASSES中搜索settings.py并移除'django.middleware.csrf.CsrfViewMiddleware',

答案 1 :(得分:1)

Django-Rest-Framework automatically adds @csrf_exempt to all APIView (or @api_view)

只有SesssionAuthentication迫使您(正确)使用CSRF的例外,请参阅docs on CSRFDRF source

答案 2 :(得分:1)

我这样解决了这个问题:

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

为:

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

答案 3 :(得分:0)

我有类似的问题。我尝试使用 public function index() { $cablenetworks = CableNetwork::all(); $dstvplans = CablePlan::where('cablenetwork_id', 1)->get(); $gotvplans = CablePlan::where('cablenetwork_id', 2)->get(); $startimesplans = CablePlan::where('cablenetwork_id', 3)->get(); $transactions = Transaction::where('user_id', Auth::id()) ->where('payment_type', 'cable')->orderBy('created_at', 'DESC')->paginate(10); $gettoken = AirAdmin::all(); foreach ($gettoken as $q) { $token = $q->token; } return view('resellerutility.index', compact('cablenetworks', 'dstvplans', 'gotvplans', 'startimesplans', 'transactions', 'token')); } ,但没有用。

我将@csrf_exempt更改为ALLOWED_HOSTS = '*',它对我在本地有效。