有没有办法将nonce添加到手动创建的表单中?例如,在控制器中创建SQLFORM并在视图中将其呈现为{{=form}}
将自动将该随机数附加到表单。
但手动创建的内容如下:
<form>
<input type="text">
<button type="Submit">Submit</button>
</form>
没有nonce。
答案 0 :(得分:0)
您可以使用FORM()
或SQLFORM()
照常在控制器中构建和处理表单对象。在这种情况下,您仍然可以在视图中为表单创建完全自定义的HTML(只要输入字段名称匹配) - 您只需要包含特殊的隐藏_formname和_formkey字段,您可以通过{{1 }}
在控制器中:
form.custom.end
在视图中:
def myform():
return dict(form=SQLFORM(db.mytable).process())
注意,<form>
<input type="text">
<button type="Submit">Submit</button>
{{=form.custom.end}}
包含结束form.custom.end
标记,因此无需明确添加。
如果您希望HTML更加明确,您还可以通过</form>
和form.formname
访问_formname和_formkey值,这样您就可以:
form.formkey
使用<form>
<input type="text">
<button type="Submit">Submit</button>
<div style="display:none;">
<input name="_formkey" type="hidden" value="{{=form.formkey}}" />\
<input name="_formname" type="hidden" value="{{=form.formname}}" />
</div>
</form>
生成与上述版本相同的HTML。
注意,web2py将_formkey值存储在会话中,使用_formname作为从会话中检索它的键。提交表单时,form.custom.end
方法从会话中检索_formkey值并检查它是否与表单一起提交的_formkey值匹配 - 如果没有,则处理失败。
最后,如果您真的只想创建自己的自定义formkey并处理将其存储在会话中并将其与自己提交的值进行比较,您可以这样做:
.process()
然后您必须明确处理formkey检查。