表单验证中的数据库连接 - WEB.PY - PYTHON

时间:2013-11-29 09:22:03

标签: python database forms validation web.py

我的第一个问题,也许是一个菜鸟问题,但我真的不明白我做错了什么,我在web.py文档上找不到任何线索。

是否可以使用db select来验证字段?

我在做什么: 我正在建立一个注册表单,我在用户名验证方面遇到了麻烦。 在我发现的每个例子中,用户在注册类之前在变量中声明,代码如下:

allowed = (
    ('jon','pass1'),
    ('tom','pass2')
)

并在验证中使用:

form.Validator('Username already exists.', lambda x: x not in allowed)

由于我在db中保存,我可以使用db.select更改允许的元组,但这意味着select只执行一次。 我想在每次调用POST时检查用户,所以我只是用这样的方式用db.select替换了“allowed”变量:

 form.Validator('Username already exists.', lambda x: x not in [o.usr for o in db.select('users',what='usr')])

如果我在翻译器上测试“x不在[o.usr..etc..etc ..]”,这项工作......

>>> [o.usr for o in db.select('users',what='usr')]
0.0 (1): SELECT usr FROM users
[u'hhh', u'Fede', u'Vinz', u'Patro', u'Codino', u'Codino']
>>> x = "Fede"
>>> x not in [o.usr for o in db.select('users',what='usr')]
0.0 (2): SELECT usr FROM users
False

但是当我运行代码并使用现有用户名进行新注册时,没有任何事情发生..因为您可以看到“Codino”用户名已经注册了两次。

我做错了什么?

..更有趣的是:有一种更智能的方法来阻止已经使用的用户名的注册?

谢谢, 费德里科

1 个答案:

答案 0 :(得分:0)

我不知道你是否已经有了这个答案,因为它是一个旧线程。 这是我在检查用户名是否已存在时所做的。

我创建了一个验证器,如:

vuser_exist = form.Validator("Username already exist.", lambda u: u is None or model.get_user(u.username) is None)

register_form = form.Form(
form.Textbox("username", vuser_req, vuser_length, description="Username"),    
form.Button("submit", type="submit", description="Register"),
validators = [vuser_exist],
)

在model.py

def get_user(user):
try:
    return db.select('users', where='user=$user', vars=locals())[0]
except IndexError:
    return None