Python Web2py表单进程失败

Python Web2py表单进程失败,python,web2py,Python,Web2py,我已经使用SQLFORM.factory创建了一个自定义表单 当提交此表单时,将进行回发,并涉及控制器的索引方法 如果我在给定的行下面写入以验证表单,它的计算结果将为False if searchform.process().accepted:#THIS CONDITION EVALUATES TO FALSE 但若我用下面给定的行替换这一行,它的计算结果为True if searchform.accepts(request):#THIS CONDITION EVALUATES TO TRUE

我已经使用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'
)    

请帮助我解决此问题。

当您将
会话
传递到
.accepts()
时,将在表单中添加一个隐藏的
\u formkey
字段(并向会话添加相同的值),以防CSRF攻击。提交表单时,
.accepts()
将确认提交的
\u formkey
值与会话中存储的值匹配,否则验证将失败。(注意,
.process()
方法只是
.accepts(请求、会话)
的快捷方式)

由于只有当您从
.accepts()
中排除
会话时,验证才会失败,因此(a)在视图中,隐藏的
\u formkey
字段在序列化为HTML时未包含在表单中,(b)会话cookie未与表单post一起发送回服务器,和/或(c)
\u formkey
值以某种方式从会话中清除(例如,通过类似于
session.clear()
)的方式)

最有可能的罪魁祸首是(a)。如果在视图中创建了自定义表单HTML,则必须包含隐藏的
\u formname
\u formkey
字段。最简单的方法是:

{{=form.custom.end}}  # includes the closing </form> tag
{{=form.custom.end}}包含结束标记
或:

{{=form.hidden_fields()}}}不包括结束标记

单个隐藏字段值位于
表单.formname
表单.formkey

这是一篇老文章,但似乎适合我的问题。我创建了一个自定义表单,并以{{=form.custom.end}结束它。提交在第一次尝试时失败(html中没有formkey),但稍后可以工作。如果在控制器中我有return(form=form.process()),它可以工作,但是我不能让它与keepvalues=True一起工作。有什么线索吗?
{{=form.hidden_fields()}}  # does not include the closing </form> tag