我使用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'
)
请帮我解决这个问题。
答案 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.formname
和form.formkey
。