Python Web2py表单进程失败
我已经使用SQLFORM.factory创建了一个自定义表单 当提交此表单时,将进行回发,并涉及控制器的索引方法 如果我在给定的行下面写入以验证表单,它的计算结果将为FalsePython 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
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