将nonce添加到手动创建的表单

时间:2013-05-09 13:49:27

标签: web2py

有没有办法将nonce添加到手动创建的表单中?例如,在控制器中创建SQLFORM并在视图中将其呈现为{{=form}}将自动将该随机数附加到表单。

但手动创建的内容如下:

<form>
    <input type="text">
    <button type="Submit">Submit</button>
</form>

没有nonce。

1 个答案:

答案 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检查。