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

上次运行测试指出无法保存用户的输入。现在,要使用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运行的很慢,功能测试时就能看见如下图所示

错误信息中有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了。

Django学习系列10:保存用户输入——编写表单,发送POST请求的更多相关文章

  1. Django 学习第十天——状态保持及表单

    状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 2.客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 3.存 ...

  2. Django学习系列5:为视图编写单元测试

    打开lists/tests.py编写 """向浏览器返回真正的HTML响应,添加一个新的测试方法""" from django.test i ...

  3. Django学习系列之路由系统

    一.基于App的路由 作用: 根据App对路由规则进行分类,在全局urls.py包含某个项目的urls.py 示例 定义全局urls.py(全局路由系统) #导入include from django ...

  4. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  5. 不让input表单的输入框保存用户输入的历史记录

    如何不让input表单的输入框保存用户输入的历史记录.  有时我们在设计网页时不想让表单保存用户输入历史记录,比如一些隐私数据,或一些冲值卡 <input name="test&quo ...

  6. js打印保存用户输入的内容

    在用js打印局部页面时,遇到用户新输入的内容没能打印出来,经过观察,发现我采用的js打印方法是读取页面源代码,而用户输入的内容如果不将其写入到页面源代码中去,是打印不出来的,下面是我的解决方法: // ...

  7. Django学习系列9:接着修改首页

    现在的功能测试还是失败的,继续修改代码,让其通过.因为HTML现在保存在模板中,可以尽情修改,无需编写额外的单元测试.我们需要一个<h1>元素 修改:lists/templates/hom ...

  8. 六、Django学习之基于下划线的跨表查询

    六.Django学习之基于下划线的跨表查询 一对一 正向查询的例子为 已知用户名,查询用户的电话号码.反向查询例子反之. 正向查询 其中下划线前的表示表名,无下划线的表示的是Author表 resul ...

  9. Blazor和Vue对比学习(基础1.9):表单输入绑定和验证,VeeValidate和EditFrom

    这是基础部分的最后一章,内容比较简单,算是为基础部分来个HappyEnding.我们分三个部分来学习: 表单输入绑定 Vue的表单验证:VeeValidate Blazor的表单验证:EditForm ...

随机推荐

  1. EL表达式与JSTL标签库(一)

    1.JSTL概述 JSTL标签库由标签库和EL表达式两个部分组成.JSTL标准标签库(Java Server Page Standard Tag Library),用来解决创建的页面的操作问题,包括输 ...

  2. DESC加密解密算法

    using System; using System.Text; using System.Windows.Forms; using System.Security.Cryptography; usi ...

  3. docker中tomcat日志输出自定义

    一,默认tomcat日志配置文件 /data/tomcat/conf/logging.properties 1,修改tomcat/conf下的logging.properties [root@harb ...

  4. 关于Pytorch中accuracy和loss的计算

    这几天关于accuracy和loss的计算有一些疑惑,原来是自己还没有弄清楚. 给出实例 def train(train_loader, model, criteon, optimizer, epoc ...

  5. 快速排序基本思想,递归写法,python和java编写快速排序

    1.基本思想 快速排序有很多种编写方法,递归和分递归,分而治之法属于非递归,比递归简单多了.在这不使用代码演示.下面我们来探讨一下快速排序的递归写法思想吧. 设要排序的数组是A[0]……A[N-1], ...

  6. C++学习笔记-C++对C语言的扩充和增强

    C++兼容C,在C的基础上学习C++是一个不错的选择,也能够更好的了解C与C++的区别与联系. 变量定义 C语言中的变量都必须在作用域开始的位置定义 C++中更强调语言的实用性,所有的变量都可以在需要 ...

  7. Zebra架构与大数据架构优劣对比

    zebra架构的缺点 文件存储方式的缺点 1. 一个文件如果特别大,这样会造成存储的问题.一台机器的磁盘也不可能存储特别大的文件 2. 该文件在查询.删除.修改的时候都会存在问题 3. 如果文件太多, ...

  8. PTA(Basic Level)1060.爱丁顿数

    英国天文学家爱丁顿很喜欢骑车.据说他为了炫耀自己的骑车功力,还定义了一个"爱丁顿数" E ,即满足有 E 天骑车超过 E 英里的最大整数 E.据说爱丁顿自己的 E 等于87. 现给 ...

  9. HDU1251 统计难题(字典树|map

    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分 ...

  10. linux 三剑客之awk总结

    AWK 1.begin end使用 cat /tmp/passwd |awk -F ':' 'BEGIN {print "hello"} {print $1"\t&quo ...