如何在测试django时禁用csrf?

时间:2015-03-11 09:46:51

标签: django testing csrf

我在使用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渲染吗?

3 个答案:

答案 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={ ... })