1

我正在使用 web.py 框架来设计一个小型 Web 应用程序,目前我已经创建了一个登录页面,代码如下

索引.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()  

在上面的代码中,我的意图是

"Username not provided"1.如果没有提供用户名,点击登录时应该显示

2.如果没有提供密码"password not provided",点击登录时会显示

3.如果提供了密码但长度小于7个字符,"Password length should be minimum 7 characters"点击登录时应该显示(当然这个验证概念适合creating a user选择密码时)

4.如果两者都没有提供它应该"Please Enter Login Details"在点击登录时显示

5.如果登录详细信息不匹配,"Invalid Username or Password"单击登录时应显示,如果登录详细信息匹配应重定向到下一页

在上面的代码中,当登录详细信息成功匹配重定向到下一页时,如果没有显示Invalid username or password通过(我从页面 return render.login_error(form)复制了相同的 html 代码并在其中添加了额外的行)login(form)login_error(form)"Invalid Username or Password"

我还创建了一个regex用于密码验证的表达式,并希望它能正常工作(我仔细检查过),因为如果密码长度小于 7 个字符,它不会重定向到下一页而是重定向到同一个登录页面,但同时我想显示在浏览器上,就像"Password length should be minimum 7 characters"我无法做的消息一样(不知道该怎么做)

另外,如上所述,我form.notnull()在创建时已将用户名作为验证Form,当我尝试单击登录时,它正在检查表单是否验证,如果没有重定向到同一登录页面,但我想显示消息"Please enter the username",如果没有,也显示密码假如

  1. 上述正则表达式是否能正常工作(直到现在我都在使用正则表达式)

  2. 如果浏览器上未提供用户名、密码,如何在浏览器上显示上述验证消息,因为我创建了另一个 html 页面,只是为了让Invalid username or password消息在详细信息不正确时出现在浏览器上

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

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

4

1 回答 1

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

于 2012-10-16T22:18:38.647 回答