【发布时间】:2015-11-30 15:44:43
【问题描述】:
我已经开发了一个简单的 web 服务,但是由于它抱怨 CSRF,所以无法在 Django Rest Framework 中使用 post:
"detail": "CSRF 失败:CSRF cookie 未设置。"
删除 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'
)
【问题讨论】:
-
对于每个 POST 请求,您都需要发送一个 crsf-token。在文档docs.djangoproject.com/en/1.7/ref/contrib/csrf/#csrf-ajax 中有更多关于此的信息
-
@Hinrich :这就是
csrf_exempt装饰器的重点:绕过 csrf 验证,参见 docs.djangoproject.com/en/1.8/ref/csrf/… -
你试过没有
csrf_exempt的api_view装饰器吗?您使用的是什么身份验证后端? -
我试过了,还是不行。我已经添加了我正在使用的身份验证后端。顺便说一句,对于这个特定的请求,我正在使用带有 cookie 的会话身份验证。