【问题标题】:Webpage resubmitting data onto table after refresh [confirm form resubmission]网页刷新后提交数据入表【确认表单重新提交】
【发布时间】:2016-05-14 15:58:53
【问题描述】:

每当我提交表单时,它都会起作用。如果我尝试刷新页面,它会问这个:

然后,如果我单击继续,它将再次将数据重新提交到表格中。所以基本上我问的是如何阻止它在单击刷新后将数据重新提交到表中?可以停止吗?我在这里错过了什么吗?我可以以某种方式绕过这个吗?

我的sqldb表:

索引

def index():
if request.vars:
    sqldb.uevent.insert(name=request.vars.name, latitude=request.vars.lat, longitude=request.vars.lng, phone=request.vars.phone, description=request.vars.description)

查看

<form method="post">
                  <div class="form-group">
                      <label>Name of Uevent:</label>
                      <input class="form-control" id="formName" placeholder="Uevent..." name="name">
                  </div>
                  <div class="form-group">
                     <input type="hidden" class="form-control" id="formLat" name="lat">
                  </div>
                  <div class="form-group">
                    <input type="hidden" class="form-control" id="formLong" name="lng">
                  </div>
                  <div class="form-group">
                    <label>Phone:</label>
                    <input class="form-control" id="formPhone" placeholder="Phone..." name="phone">
                  </div>
                 <div class="form-group">
                    <label>Description of Uevent:</label>
                     <textarea class="form-control" rows="3" id="formDescription" placeholder="Description..." name="description"></textarea>
                  </div>
                 <button type="submit" class="btn btn-primary">Submit</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
             </form>

型号

sqldb.define_table('uevent',
               Field('name', label="Name"),
               Field('latitude', 'float', label="Latitude",readable=False),
               Field('longitude', 'float', label="Longitude",readable=False),
               Field('phone', label="Phone"),
               Field('description', 'text' ,label="Description", default="No Description"),
               Field('appropriate', label="Appropriate",writable=False,readable=False))

【问题讨论】:

    标签: forms refresh web2py


    【解决方案1】:

    简短的回答是您不应该在 POST 请求(例如,典型的表单提交)之后刷新浏览器页面,因为您正在指示浏览器重新提交 POST(这就是浏览器弹出警告的原因 - - 您通常不想多次​​发布相同的数据)。

    在 web2py 端,如果使用 FORMSQLFORM 助手,可以防止重复的数据库插入。默认情况下,他们会在表单中添加一个唯一的 _formkey 字段,以防止 CSRF 攻击并防止同一表单的多次提交。

    如果您不想使用 web2py 表单助手,您可以自己编写类似的逻辑。只需使用您也存储在会话中的唯一键向表单添加一个隐藏字段(每次请求页面时都必须生成一个新的唯一键)。提交表单时,确保提交的键与会话中的值匹配。提交后,从会话中删除密钥,这样任何后续提交都将被拒绝。

    【讨论】:

      猜你喜欢
      • 2015-11-16
      • 1970-01-01
      • 2014-05-21
      • 2012-05-25
      • 1970-01-01
      • 2013-09-21
      相关资源
      最近更新 更多