刷新后网页将数据提交到 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 表单助手,您可以自己编写类似的逻辑。只需在表单中添加一个隐藏字段,并使用您也存储在会话中的唯一键(每次请求页面时都必须生成一个新的唯一键)。提交表单时,确保提交的键与会话中的值匹配。提交后,从会话中删除密钥,这样任何后续提交都将被拒绝。
每当我提交表格时,它都能正常工作。如果我尝试刷新页面,它会询问:
然后,如果我单击“继续”,它会再次将数据重新提交到 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 表单助手,您可以自己编写类似的逻辑。只需在表单中添加一个隐藏字段,并使用您也存储在会话中的唯一键(每次请求页面时都必须生成一个新的唯一键)。提交表单时,确保提交的键与会话中的值匹配。提交后,从会话中删除密钥,这样任何后续提交都将被拒绝。