当前位置:  开发笔记 > 后端 > 正文

Django render_to_string()忽略{%csrf_token%}

如何解决《Djangorender_to_string()忽略{%csrf_token%}》经验,为你挑选了2个好方法。

我正在尝试在Django中执行单元测试.我有以下表格index.html:

{% csrf_token %}

我正在测试视图是否正确呈现模板:

views.py

def homePage(request):
    return render(request, 'index.html')

tests.py:

request = HttpRequest()

response = homePage(request)
if response:
    response = response.content.decode('UTF-8')

expectedHTML = render_to_string('index.html')
self.assertEqual(response, expectedHTML)

response有一个带有csrf标记的隐藏输入字段; 但是,expectedHTML没有(在这个地方只有一个空白行{% csrf_token %}).所以断言总是失败.

是否可以render_to_string()生成csrf输入字段?如果是这样,那令牌会不会responseexpectedHTML

或者,有没有办法忽略输入字段,以便测试可以成功?



1> Alasdair..:

要在使用时使csrf令牌工作render_to_string,您需要提供request对象以便上下文处理器运行.

在Django 1.8+中,您可以简单地将请求作为参数传递

return render_to_string('index.html', request=request)

在早期版本中,您可以使用RequestContext.

from django.template import RequestContext
render_to_string('index.html', context_instance=RequestContext(request))


对于``render_to_string``,``context_instance``是[自Django 1.8以来不推荐使用](https://docs.djangoproject.com/en/1.9/topics/templates/#django.template.loader.render_to_string).请改用``render_to_string('index.html',request = request)``.

2> Da CodeKid..:

不幸的是,Alasdair的答案不适用于每个请求Django 1.10csrf_token更改.请看这个适用于1.10的要点.(改变代码以修复原始要点中的错字)

class HomePageTest(TestCase):

    @staticmethod
    def remove_csrf(html_code):
        csrf_regex = r']+csrfmiddlewaretoken[^>]+>'
        return re.sub(csrf_regex, '', html_code)

    def assertEqualExceptCSRF(self, html_code1, html_code2):
        return self.assertEqual(
            self.remove_csrf(html_code1),
            self.remove_csrf(html_code2)
        )

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有