【问题标题】:How to display validation message on the browser in web.py python如何在 web.py python 中的浏览器上显示验证消息
【发布时间】:2012-10-16 07:00:37
【问题描述】:

我正在使用 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.如果两者都没有提供,点击登录时应该显示"Please Enter Login Details"

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

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

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

此外,我在Form 创建中将用户名作为form.notnull() 验证,如上所述,当我尝试单击登录时,它正在检查表单是否验证以及是否重定向到相同的登录页面,但我想显示消息"Please enter the username",如果未提供密码,则显示密码

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

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

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

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

【问题讨论】:

    标签: python validation web.py


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

    【讨论】:

    • K 我已经编辑了代码,现在我只想检查两个条件,用户名和密码,即如果未提供用户名或未提供密码,浏览器上应显示一条消息,如“请输入用户名”和“请输入密码”,但是当我运行代码并通过单击带有用户名和没有密码的登录按钮进行检查时,它没有在浏览器上显示“请输入密码”消息。
    • 我们是否需要在 login.html(render.login(form)) 中设计这些消息在浏览器上显示?或者我上面的代码是否有任何错误?我们是否需要在 get 方法或 post 方法中检查这个?
    • 如果您不介意,请在我上面粘贴的完整代码中添加或更正此功能代码,因为这是第一个网页设计应用程序,下次将自行设计......跨度>
    • webpy 网站上有一个表单的工作示例,请查看:webpy.org/cookbook/forms
    • 是的..我明白了它不起作用的地方。实际上,在上面的代码中创建 login_form 后,我将其发送到 render.login(login_form),但我没有在 $:login_form.render 之类的 html 页面中呈现它,我在 index.html 中为用户名的登录页面创建了单独的 html ,密码,登录按钮。但实际上我不想渲染它,我想创建自己的 html 并且功能应该可以工作,是否可以通过渲染 $:form.render() 在浏览器上验证和显示这些消息在 index.html 中?
    猜你喜欢
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2019-01-12
    • 2013-07-10
    • 2017-09-02
    相关资源
    最近更新 更多