【发布时间】:2017-03-06 10:57:25
【问题描述】:
我正在使用 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 验证的正确方法是什么?
【问题讨论】:
标签: django testing django-rest-framework django-csrf