我的应用使用django rest_framework和SessionAuthentication。我可以成功登录并在cookie中设置会话ID和csrf令牌。但是,POST请求仍然抱怨CSRF失败。
我和Postman一起测试并得到了
{“detail”:“CSRF失败:CSRF令牌丢失或不正确。”}
class ApiLoginView(APIView):
authentication_classes = (BasicAuthentication, )
permission_classes = (IsAuthenticated,)
def post(self, request, *args, **kwargs):
# use django.contrib.auth.login
login(request, request.user)
user = request.user
return Response("login success")
class ApiUserView(APIView):
authentication_classes = (SessionAuthentication,)
permission_classes = (IsAuthenticated,)
def post(self, request):
return Response("ApiUser Post Success")
Postman是一个正确的测试工具吗? this seems to be a similar problem in Postman
我遗失的任何东西?我有什么选择来测试django_rest_framework。
对不起,这似乎是一个常见的问题,但在阅读相关帖子后我找不到工作。
答案 0 :(得分:0)
您确实可以使用Postman通过会话身份验证来测试Django Rest Framework。看来,OP勾选了所有框。但是,作为检查清单,我提供了这套对我有用的步骤。
使用DRF,Postman和django会话身份验证时,您需要按以下方式配置邮递员客户端:
1)按以下方式在Postman中设置标头(在本例中为PATCH,但很容易成为POST):
2)再次在Postman中将Body设置为raw并插入要发送的JSON数据,如下所示:在这里,我正在更改客户端的电话号码。
{
"telefone": "42-42424242"
}
3)设置一个名为csrftoken的cookie和一个名为sessionid的cookie
csrf cookie的值应与步骤1中的X-CSRFToken标头相同,即
有了这三个要素,并且正确配置了DRF,您应该就可以了。在DRF的设置中,检查是否包含SessionAuthentication:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
),....