Web2py表单进程失败

时间:2013-09-11 05:17:20

标签: python web2py

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

提交此表单时,会发生回发,它涉及我的控制器的索引方法。

如果我在给定的行下面写下来验证表单,它的计算结果为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'
)    

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

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

由于验证仅在您从session中排除.accepts()时失败,因此看起来(a)在视图中,隐藏的_formkey字段未包含在表单中它被序列化为HTML,(b)会话cookie没有通过表单发送回服务器,和/或(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.formnameform.formkey