刷新后网页将数据提交到 table [确认表单重新提交]

Webpage resubmitting data onto table after refresh [confirm form resubmission]

每当我提交表格时,它都能正常工作。如果我尝试刷新页面,它会询问:

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

我的 sqldb table:

index

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)

view

<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>

model

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))

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

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

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