我在使用csrf令牌测试视图时遇到问题。
此代码
class ViewTests(TestCase):
def test_bets_view(self):
login_page = self.client.get('/users/login/')
print(login_page.content)
返回带有CSRF隐藏输入的HTML。
这件事,我需要与之前的HTML进行比较,
expected_html = render_to_response('login.html',
dictionary={'form': LoginForm()})
没有隐藏CSRF输入。因此断言失败了。
我可以在测试客户端中禁用CSRF渲染吗?
答案 0 :(得分:2)
您永远不应该比较完整的HTML内容。只需检查功能。如果你需要不惜任何代价禁用csrf
,我认为遵循逻辑应该有所帮助。
在views.py
文件中,添加以下包
from django.views.decorators.csrf import csrf_exempt
然后就在您执行支票的功能定义之前,添加以下代码段:
@csrf_exempt
这将禁用csrf的默认验证。即使您的传入请求具有隐藏的csrf令牌,您的服务器功能也会完全忽略它。这应该可以解决禁用csrf的问题。
答案 1 :(得分:2)
首先,在测试中获取页面并从中提取csrf标记:
page = self.client.get("/users/login")
token = page.context.get("csrf_token")
然后使用相同的标记来渲染模板并进行比较:
expected_html = TemplateResponse(
page.wsgi_request,
"login.html",
context={"form": LoginForm(), "csrf_token": token}).render()
assert expected_html.content == page.content
答案 2 :(得分:1)
您可以像这样在单元测试中覆盖中间件设置:
from django.test import override_settings
testing_middleware = [ ... anything but csrf middleware goes here ]
class TestWhatever(TestCase)
@override_settings(MIDDLEWARE=testing_middleware)
def testSomething():
# no csrf error will occur
self.client.post('/', data={ ... })