我的第一个问题,也许是一个菜鸟问题,但我真的不明白我做错了什么,我在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”用户名已经注册了两次。
我做错了什么?
..更有趣的是:有一种更智能的方法来阻止已经使用的用户名的注册?
谢谢, 费德里科
答案 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