如何在web.py python中的浏览器上显示验证消息

时间:2012-10-16 07:00:37

标签: python validation web.py

我正在使用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 passwordreturn 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以及密码(如果没有提供)

  1. 上面的正则表达式是否能正常工作(直到现在才对正则表达式起作用)

  2. 如果在浏览器上没有提供用户名,密码,如何在浏览器上显示上述验证消息,因为我创建了另一个html页面,只是为了在浏览器上显示"Please enter the username"消息时详细信息是不正确

  3. 我们是否可以在单个html文件(如Invalid username or password)本身中进行所有这些验证? , 我已经尝试了很多,但我无法捕捉到这里发生的过程,如果是这样我们可以节省为个别消息创建多个html

    谁能告诉我如何解决上述常见问题? 不介意我的查询,因为这是我在Web应用程序中的第一步,我在

    之前使用Web应用程序

1 个答案:

答案 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不会被触发,因为只有在所有字段验证器都通过后才会触发表单级验证。