是的,你可以这样做:
(在模型文件中,或者在控制器的顶部,或者更好地制作一个函数装饰器)
检查session.logged_in_user 以查看它是否为None,如果None,则重定向到/default/login,您会在其中向用户提供表单:
form = FORM(Field('username'), requires=IS_IN_DB(db, db.users.username))
在提交表单时(请参阅 web2py 手册以了解表单处理),如果有效(例如,如果用户名存在于 db.users 表中),则设置 session.logged_in_user = request.vars.username
这是一个完整的例子(未经测试):
models/Auth.py
# Could also check whether session.logged_in_user exists in DB, but probably not needed
# If so though, should be renamed zAuth or something to come after db.py file
if not session or not session.logged_in_user:
redirect(URL('default','login', vars={'next':request.vars.url}))
controllers/default.py
#in file: controllers/default.py
...
def login():
form = FORM(Field('username', requires=IS_IN_DB(db, db.users.username))
if form.process().accepted:
session.logged_in_user = form.vars.username
redirect(request.vars.next)
elif form.errors:
session.logged_in_user = None # not necessary, but oh well
response.flash = "Please enter a valid username"
return dict(form=form)
views/default/login.html
{{ extend 'layout.html' }}
{{ =form }}
通过将代码放置在模型文件中,您可以确保它在每个页面请求上都被执行。
这将不允许您使用 web2py 的身份验证机制(即auth = AUTH()),但我不确定您是否想要它,除非您对使用组和权限等感兴趣。但是如果既然如此,添加密码(即使是通用密码或空白密码)似乎也不会太麻烦。