每当我提交表单时,它都有效。如果我尝试刷新页面,它会问:
然后如果我点击继续,它会再次将数据重新提交到表格中。所以基本上我问我如何在点击刷新后阻止它重新提交数据到表中?可以停下来吗?我在这里错过了什么吗?我可以以某种方式绕过这个吗?
我的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))
答案 0 :(得分:0)
简短的回答是,您不应在POST请求后刷新浏览器页面(例如,典型的表单提交),因为您指示浏览器重新提交POST(这就是浏览器弹出警告的原因 - - 您通常不希望多次发布相同的数据。)
在web2py端,如果使用FORM
或SQLFORM
帮助程序,则可以阻止重复的数据库插入。默认情况下,它们会向表单添加一个唯一的Office.initialize = function (reason) {
...
};
字段,以防止CSRF攻击并防止多次提交相同的表单。
如果您不想使用web2py表单助手,您可以自己编写类似的逻辑。只需使用您还存储在会话中的唯一键向表单添加隐藏字段(每次请求页面时都必须生成新的唯一键)。提交表单时,请确保提交的密钥与会话中的值匹配。提交后,从会话中删除密钥,以便后续提交的任何内容都将被拒绝。