我正在使用Django Rest Framework 3,并希望测试CSRF验证。
首先,我初始化DRF的APIClient
:
client = APIClient(enforce_csrf_checks=True)
然后我给用户设置了一个密码,这样我就可以登录并获取会话:
superuser.set_password('1234')
superuser.save()
client.login(email=superuser.email, password='1234')
现在我们需要一个CSRF令牌。为此,我只需创建一个请求并从cookie中检索令牌即可。
response = client.request()
csrftoken = client.cookies['csrftoken'].value
在检查代码时,这似乎是有效的,我得到了一个看起来有效的CSRF令牌。然后我执行POST请求,传递
csrfmiddlewartoken
参数:data = {'name': 'My fancy test report', 'csrfmiddlewaretoken': csrftoken}
response = client.post(API_BASE + '/reports', data=data, format='json')
assert response.status_code == status.HTTP_201_CREATED, response.content
问题是,这个失败了:
tests/api/test_api.py:156: in test_csrf_success
assert response.status_code == status.HTTP_201_CREATED, response.content
E AssertionError: {"detail":"CSRF Failed: CSRF token missing or incorrect."}
E assert 403 == 201
E + where 403 = <rest_framework.response.Response object at 0x7f7bd6453bd0>.status_code
E + and 201 = status.HTTP_201_CREATED
如何正确地使用DRF测试CSRF验证?
@method_decorator(ensure_csrf_cookie)
中出现了错误,这个装饰器确保Response
带有 csrf cookie,而不是要求Request
具有该 cookie。因此,你没有检查任何内容,正确的装饰器应该是@method_decorator(csrf_protect)
,我希望这只是打字错误。 - CompadrePOST
没问题。我导入的是正确的,但是在这里编辑器中复制粘贴出了问题。 - erewok