我在使用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渲染?
您永远不应该比较完整的HTML内容。只需检查功能。如果您需要不惜任何代价禁用csrf
,我认为遵循逻辑应该有所帮助。
在views.py
文件中,添加以下包
from django.views.decorators.csrf import csrf_exempt
然后就在您执行检查的函数定义之前,添加以下代码段:
@csrf_exempt
这将禁用csrf的默认验证。即使您的传入请求具有隐藏的csrf令牌,您的服务器功能也会完全忽略它。这应该可以解决禁用csrf的问题。
首先,在测试中获取页面并从中提取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
您可以在单元测试中覆盖中间件设置,如下所示:
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={ ... })