我在尝试使用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/
答案 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 CSRF或DRF 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 = '*'
,它对我在本地有效。