Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django csrf令牌正在修改预期输出并导致单元测试失败_Python_Django_Selenium - Fatal编程技术网

Python Django csrf令牌正在修改预期输出并导致单元测试失败

Python Django csrf令牌正在修改预期输出并导致单元测试失败,python,django,selenium,Python,Django,Selenium,我目前正在使用Python进行Harry Percival的测试驱动开发,当我将{%csrf_token%}添加到html模板时,我就遇到了一个响应问题 由于这是测试驱动的开发,有两个单元测试失败了 当我删除{%csrf_token%}时,我得到了一个通过的测试。当它存在于代码中时,它会修改响应以包含意外的行 <input type="hidden" name="csrfmiddlewaretoken" value="WaPf57..."> 有没有办法将其从响应中删除,或者我应该修

我目前正在使用Python进行Harry Percival的测试驱动开发,当我将{%csrf_token%}添加到html模板时,我就遇到了一个响应问题

由于这是测试驱动的开发,有两个单元测试失败了

当我删除{%csrf_token%}时,我得到了一个通过的测试。当它存在于代码中时,它会修改响应以包含意外的行

<input type="hidden" name="csrfmiddlewaretoken" value="WaPf57...">

有没有办法将其从响应中删除,或者我应该修改测试,使其包含所有预期的HTML并忽略“隐藏”的csrfmiddlewaretoken?

学习Django的好书!错误的来源基于csrf_令牌标记的功能,可以找到关于其工作原理的文档。简而言之,每个会话都有自己的csrf令牌,以确保请求来自您的网页本身,而不仅仅是从其他地方发布到您的服务器。考虑到这一点,对页面的请求和呈现为字符串的模板应该具有不同的内容

在那本书中你会看到很多的一点是问自己这个测试是什么?在这种情况下,您似乎希望检查呈现的模板是否是您期望的模板,并且您可能希望对其执行断言,而不是
response.content.decode

如果你按照这个建议去做,结果会是:

    self.assertEqual(response.templates[0].name, 'home.html')

非常适合学习Django的书!错误的来源基于csrf_令牌标记的功能,可以找到关于其工作原理的文档。简而言之,每个会话都有自己的csrf令牌,以确保请求来自您的网页本身,而不仅仅是从其他地方发布到您的服务器。考虑到这一点,对页面的请求和呈现为字符串的模板应该具有不同的内容

在那本书中你会看到很多的一点是问自己这个测试是什么?在这种情况下,您似乎希望检查呈现的模板是否是您期望的模板,并且您可能希望对其执行断言,而不是
response.content.decode

如果你按照这个建议去做,结果会是:

    self.assertEqual(response.templates[0].name, 'home.html')

解决方案是模拟令牌生成函数,以便在需要比较输出是否相等时,它具有可预测的值

例如,下面的代码块将确保html输出包含
,而不是随机令牌字符串

from unittest import mock

from django.test import TestCase


@mock.patch('django.template.context_processors.get_token', mock.Mock(return_value='predicabletoken'))
class HomeTests(TestCase):
  def test_home_page_returns_correct_html(self):
    request = HttpRequest()
    response = home_page(request)
    expected_html = render_to_string('home.html')
    print('response: ', response.content.decode())
    print('expected: ', expected_html)
    self.assertEqual(response.content.decode(), expected_html)

解决方案是模拟令牌生成函数,以便在需要比较输出是否相等时,它具有可预测的值

例如,下面的代码块将确保html输出包含
,而不是随机令牌字符串

from unittest import mock

from django.test import TestCase


@mock.patch('django.template.context_processors.get_token', mock.Mock(return_value='predicabletoken'))
class HomeTests(TestCase):
  def test_home_page_returns_correct_html(self):
    request = HttpRequest()
    response = home_page(request)
    expected_html = render_to_string('home.html')
    print('response: ', response.content.decode())
    print('expected: ', expected_html)
    self.assertEqual(response.content.decode(), expected_html)
“意外”输出正是
{%csrf_token%}
所期望的,是一个重要的安全特性。您最不想做的事情就是删除它。不幸的是,我对测试知之甚少,但这一测试过程是有缺陷的。您没有为
render_to_string
提供任何上下文,因此,我想它工作的唯一原因是该模板没有使用任何上下文变量。我不认为比较原始HTML有什么价值,最好检查提交表单时是否呈现了正确的模板以及是否发生了正确的操作。这种“意外”输出正是
{%csrf\u token%}
所期望的,并且是一个重要的安全特性。您最不想做的事情就是删除它。不幸的是,我对测试知之甚少,但这一测试过程是有缺陷的。您没有为
render_to_string
提供任何上下文,因此,我想它工作的唯一原因是该模板没有使用任何上下文变量。我看不出比较原始HTML有什么价值,最好检查是否呈现了正确的模板,以及表单提交时是否执行了正确的操作。