在 web2py 中传递参数

Passing args in web2py

我的table是:

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。

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

在此方面我将不胜感激。

一种选择是将图片 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)

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

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