• 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了。

  • 相关阅读:
    How Many Answers Are Wrong(带权并查集)
    Dice
    Plants vs. Zombies(二分好题+思维)
    Marriage Match IV(最短路+网络流)
    Treasure Hunt
    The Doors(几何+最短路,好题)
    90. Subsets II
    89. Gray Code
    88. Merge Sorted Array
    87. Scramble String
  • 原文地址:https://www.cnblogs.com/ranxf/p/11672815.html
Copyright © 2020-2023  润新知