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运行的很慢,功能测试时就能看见如下图所示

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

 

posted @ 2019-10-15 10:12  Ranxf  阅读(395)  评论(0编辑  收藏  举报