Django学习系列10:保存用户输入——编写表单,发送POST请求

时间:2023-03-09 19:12:02
Django学习系列10:保存用户输入——编写表单,发送POST请求

要获取用户输入的待办事项,发送给服务器,这样才能使用某种方式保存待办事项,然后在显示给用户查看。

上次运行测试指出无法保存用户的输入。现在,要使用HTML post请求。

若想让浏览器发送POST请求,要给<input>元素指定name=属性,然后把他放在<form>标签中,并为<form>标签指定method=POST属性,这样浏览器才能向服务器发送POST请求。

调整一下lists/templates/home.html中的模板

<html>
<head>
<title>To-Do lists</title>
</head>>
<body>
<h1>Your To-Do list</h1>
<form method="POST" action="">
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item" />
<input type="submit" value="ok">
</form> <table id="id_list_table"></table>
</body>
</html>

功能测试结果

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="id_list_table"]

为了找出问题

  1. 添加print语句,输出页面中当前显示的文本是什么?
  2. 改进错误信息,显示当前状态的更多信息
  3. 亲自手动访问网站
  4. 在测试执行过程中使用time.sleep暂停;

如果selenium运行的很慢,功能测试时就能看见如下图所示

Django学习系列10:保存用户输入——编写表单,发送POST请求

错误信息中有CSRF(跨站请求伪造)漏洞。django针对CSRF的保护措施是在生成的每一个表单中放置一个自动生成的令牌,通过这个令牌判断POST请求是否来自一个网站。

之前的模板时是纯碎的HTML,在这里要首次体验Django模板的魔力,使用“模板标签”(template tag)添加CRSF令牌。

模板标签的句法是花括号和百分号形式,即{%…%}——这种写法很有名,要连续多次同时按两个键,是比较麻烦的输入方式。

        <form method="POST" action="">
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item" />
{% csrf_tocken %}
</form>

渲染模板时,Django会把这个模板标签替换成一个<intput type='hidden'>元素,其值时CSRF令牌。现在运行功能测试,会看见一个预期失败

AssertionError: False is not true : New to-do item did not appear in table

因为time.sleep还在,所以测试会在最后一屏上暂停。可以看到,提交表单后新添加的待办事项不见了,页面刷新后又显示了一个空表单。这是因为还没连接服务器让它处理。

现在可以删掉time.sleep了。