我正在使用web.py框架来设计一个小型Web应用程序,目前我创建了一个登录页面,代码在下面
index.py
import web
from web import form
from web.contrib.auth import DBAuth
import MySQLdb as mdb
render = web.template.render('templates/')
urls = (
'/', 'Login',
'/projects', 'Projects',
'/logout', 'Logout',
)
app = web.application(urls, globals()) # Creating an instance(object) app which is the mediator between our classes and the web.It will handle browser requests and serve your pages
web.config.debug = False
db = web.database(dbn='mysql', db='Python_Web', user='root', pw='redhat')
settings = {}
if web.config.get('_session') is None:
session = web.session.Session(app,web.session.DiskStore('sessions'),initializer={'user':'anonymous','loggedin':False})
web.config._session = session
else:
session = web.config._session
auth = DBAuth(app, db, session,**settings)
def logged():
if session['loggedin'] == 1:
return True
else:
return False
class Login:
# field validators
username_required = form.Validator("Username not provided", bool)
password_required = form.Validator("Password not provided", bool)
# form validators
login_details_required = form.Validator("Please Enter Login Details", lambda f: f["username"] or f["password"])
login_form = form.Form(
form.Textbox('username', username_required),
form.Password('password',password_required,description="Password"),
form.Button('Login'),
)
def GET(self):
if logged():
raise web.seeother('/projects')
else:
form = self.login_form()
return render.login(form)
def POST(self):
if not my_form.validates(dict(username="", password="small")):
return render.login(form)
i = web.input()
username = i.username.strip()
password = i.password.strip()
user = auth.authenticate(username, password)
if not user:
session.loggedin = False
return render.login_error(form)
else:
auth.login(user)
session.loggedin = True
session.user = i.username.strip()
raise web.seeother('/projects')
if __name__ == "__main__":
web.internalerror = web.debugerror
app.run()
在上面的代码中,我的意图是
1.如果未提供用户名,则在点击登录时应显示"Username not provided"
2.如果未提供密码,则在点击登录时应显示"password not provided"
3.如果提供密码但长度小于7个字符,则单击登录时应显示"Password length should be minimum 7 characters"
(当然,此验证概念适用于creating a user
选择密码时
4.如果两者都未提供,则单击Login
时应显示"Please Enter Login Details"
5.如果登录详细信息不匹配,则单击“登录”时应显示"Invalid Username or Password"
,如果匹配的登录详细信息应重定向到下一页
在上面的代码中,当登录详细信息与其重定向到下一页成功匹配时,如果没有显示Invalid username or password
到return render.login_error(form)
(我将相同的html代码从login(form)
页面复制到{{1}并添加了login_error(form)
行额外的内容)
此外,我为密码验证创建了一个"Invalid Username or Password"
表达式,并希望它能正常工作(我完全检查过),因为如果密码长度小于7个字符,它不会重定向到下一页而是重定向到同一个登录页面,但是同时我想在浏览器上显示消息regex
,我无法做到(不知道该怎么做)
此外,如上所述,我在"Password length should be minimum 7 characters"
创建时已经使用了form.notnull()
验证用户名,当我尝试点击登录时,它会检查表单是否有效,如果没有重定向到同一个登录页面,但是我希望显示消息Form
以及密码(如果没有提供)
上面的正则表达式是否能正常工作(直到现在才对正则表达式起作用)
如果在浏览器上没有提供用户名,密码,如何在浏览器上显示上述验证消息,因为我创建了另一个html页面,只是为了在浏览器上显示"Please enter the username"
消息时详细信息是不正确
我们是否可以在单个html文件(如Invalid username or password
)本身中进行所有这些验证? ,
我已经尝试了很多,但我无法捕捉到这里发生的过程,如果是这样我们可以节省为个别消息创建多个html
谁能告诉我如何解决上述常见问题? 不介意我的查询,因为这是我在Web应用程序中的第一步,我在
之前使用Web应用程序答案 0 :(得分:1)
您可以在同一输入字段中添加许多验证器,并且还有表单级验证。
from web import form
# field validators
username_required = form.Validator("Username not provided", bool)
password_required = form.Validator("Password not provided", bool)
password_length = form.Validator("Password length should be minimum 7 characters", lambda p: p is None or len(p) >= 7)
# form validators
login_details_required = form.Validator("Please Enter Login Details", lambda f: f["username"] or f["password"])
def check_login(f):
# check for login here
return False
valid_credentials = form.Validator("Invalid username or password", check_login)
login_form = form.Form(
form.Textbox('username', username_required),
form.Password('password', password_required, password_length, description="Password"),
form.Button('Login'),
validators=[login_details_required, valid_credentials],
)
my_form = login_form()
if not my_form.validates(dict(username="", password="small")):
print my_form.render_css()
if not my_form.validates(dict(username="notnull", password="just-enough")):
print my_form.render_css()
请注意,login_details_required
不会被触发,因为只有在所有字段验证器都通过后才会触发表单级验证。