如何在测试django时禁用csrf?

问题描述 投票:1回答:3

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

django testing csrf
3个回答
2
投票

您永远不应该比较完整的HTML内容。只需检查功能。如果您需要不惜任何代价禁用csrf,我认为遵循逻辑应该有所帮助。

views.py文件中,添加以下包

from django.views.decorators.csrf import csrf_exempt

然后就在您执行检查的函数定义之前,添加以下代码段:

@csrf_exempt

这将禁用csrf的默认验证。即使您的传入请求具有隐藏的csrf令牌,您的服务器功能也会完全忽略它。这应该可以解决禁用csrf的问题。


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

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={ ... })
© www.soinside.com 2019 - 2024. All rights reserved.