在web2py中传递args

时间:2015-01-24 01:01:02

标签: web2py

我的表是:

db.define_table('test', Field('name'), Field('pics', 'upload'))

行动:

def index():
    rows = db().select(db.test.ALL, limitby=(0, 5), orderby='<random>')
    return locals()

def other():
    image = db.test(request.args(0,cast=int)) or redirect(URL('index'))
    return locals()

索引视图:

{{import random

k=random.randint(0, 4)}}
<div>
<img width="500px"
     src="{{=URL('download', args=rows[k].pics)}}" />
</div>

{{block left_sidebar}}
{{for row in rows:}}
{{=LI(A(row.name, _href=URL('other', args=row.id)))}}
{{pass}}
{{end}}

现在我显示了5个随机name和1个随机pics,1 pics与五个name中的一个具有相同的ID。

我想要实现的目标是:如果点击与name匹配的pics,我想在other中显示某些内容,正确答案如果点击其他4 name中的任何一个,我想在other错误答案中显示其他内容。

我很感激这方面的帮助。

1 个答案:

答案 0 :(得分:0)

一种选择是将pic id存储在会话中:

import random

def index():
    rows = db().select(db.test.ALL, limitby=(0, 5), orderby='<random>')
    pic_row = rows[random.randint(0, 4)]
    session.pic_id = pic_row.id
    return dict(rows=rows, pic_row=pic_row)

在视图中:

<div>
<img width="500px"
     src="{{=URL('download', args=pic_row.pics)}}" />
</div>

最后,检查other()中的匹配项:

def other():
    image = db.test(request.args(0,cast=int)) or redirect(URL('index'))
    correct = image.id == session.pic_id
    del session.pic_id # to prevent multiple attempts
    return dict(image=image, correct=correct)

最好将pic id存储在会话中,而不是将其嵌入页面中的URL中,这样用户就无法通过检查HTML来破解URL或找出正确的答案。另请注意,单次检查后会删除session.pic_id,因此用户无法通过点击后退按钮进行多次猜测。

最后,请注意,最好在控制器中保留尽可能多的逻辑,而不是在视图中。因此,不是在视图中选择随机记录,而是在控制器中执行,然后将选定的记录发送到视图。