0

我使用 SQLFORM.factory 创建了一个自定义表单。

提交此表单后,将进行回发,并涉及到我的控制器的 index 方法。

如果我在给定的行下面写来验证表格,它的计算结果为 False。

if searchform.process().accepted:#THIS CONDITION EVALUATES TO FALSE

但是,如果我用下面的给定行替换这一行,它的计算结果为 True。

if searchform.accepts(request):#THIS CONDITION EVALUATES TO TRUE

下面给定的条件也失败了。

if searchform.accepts(request,session):#THIS CONDITION EVALUATES TO FALSE

我不知道为什么会这样。我相信最好的条件应该是第一个。

下面更详细地给出了创建此表单的代码:

searchform=SQLFORM.factory(
    Field('id', 'unicode',requires=empty_to_none),
    Field('account','unicode',requires=empty_to_none),
    Field('fromdate','unicode',requires=empty_to_none),
    Field('todate','unicode',requires=empty_to_none),
    Field('name','unicode',requires=empty_to_none),
    Field('status','integer'),
    Field('method',requires=IS_EMPTY_OR(IS_IN_SET(['Method1','Method2','Method3'], sort=True, zero='Select'))), 
    Field('type','unicode',requires=IS_EMPTY_OR(IS_IN_SET(['Type1','Type2',], sort=True, zero='Select'))), 
    Field('altname','unicode',requires=empty_to_none),
    Field('group','unicode',requires=IS_EMPTY_OR(IS_IN_SET(['Group1','Group2',], sort=True, zero='Select'))), 
    Field('assignee','unicode',requires=empty_to_none),
    submit_button = 'Search'
)    

请帮我解决这个问题。

4

1 回答 1

1

当您传递session.accepts()时,这将为表单添加一个隐藏_formkey字段(并向会话添加相同的值)以防止 CSRF 攻击。提交表单后,.accepts()将确认提交_formkey的值与会话中存储的值匹配——否则验证将失败。(注意,该.process()方法只是 的快捷方式.accepts(request, session))。

session因为只有在排除from时验证才会失败.accepts(),所以看起来 (a) 在视图中,隐藏_formkey字段在序列化为 HTML 时未包含在表单中,(b) 会话 cookie 未发送回带有表单 post 的服务器,和/或 (c) 该_formkey值以某种方式从会话中清除(例如,通过类似的东西session.clear())。

最可能的罪魁祸首是(a)。如果您在视图中创建了自定义表单 HTML,则必须包括隐藏_formname_formkey字段。最简单的方法是通过:

{{=form.custom.end}}  # includes the closing </form> tag

或者:

{{=form.hidden_fields()}}  # does not include the closing </form> tag

各个隐藏字段值位于form.formname和中form.formkey

于 2013-09-11T11:56:09.767 回答