Python 用户注册表单-仅在错误输入时显示错误消息

Python 用户注册表单-仅在错误输入时显示错误消息,python,forms,function,class,post,Python,Forms,Function,Class,Post,请看我在本地运行的web应用程序的屏幕截图: 正如您可能想象的那样,我试图在用户出错时创建错误消息。触发错误消息有五个参数: 用户没有输入用户名 用户名无效--包含空格字符,不在3到20个字符之间,和/或包含非a-z、a-z、0-9的字符 密码无效--它不在3到20个字符之间 密码不匹配--“验证密码”与“密码”不同 电子邮件无效--必须匹配(r'^[\S]+@[\S]+\.\]+$),表示一组字符、一个@符号、一组字符、一个句点和一组字符 如您所见,我的代码当前在加载页面时显示错误消息,而不

请看我在本地运行的web应用程序的屏幕截图:

正如您可能想象的那样,我试图在用户出错时创建错误消息。触发错误消息有五个参数:

  • 用户没有输入用户名
  • 用户名无效--包含空格字符,不在3到20个字符之间,和/或包含非a-z、a-z、0-9的字符
  • 密码无效--它不在3到20个字符之间
  • 密码不匹配--“验证密码”与“密码”不同
  • 电子邮件无效--必须匹配
    (r'^[\S]+@[\S]+\.\]+$)
    ,表示一组字符、一个@符号、一组字符、一个句点和一组字符 如您所见,我的代码当前在加载页面时显示错误消息,而不是在用户点击“提交”之后

    我无法在网站上托管此web应用,原因如下(我的托管服务HostGator不支持WebApp2,并且我无法将存储库上载到Google Cloud)

    为了提供帮助,您可能需要在本地测试这些文件(可能通过Google App Engine)。下面是指向我的GitHub存储库的链接以及文件main.py的代码:


    代码中的所有其他内容看起来都一样。我不知道为什么当参数没有像我想的那样满足时,错误消息没有显示出来。如果可以的话请帮忙,谢谢

    首先,您的错误消息显示在文本框的左侧,因为这是您将它们放在表中的位置。在执行字符串替换时,当用户输入错误时,您希望消息显示在标签的右侧。因此,您的表应该如下所示:

    class MainHandler(webapp2.RequestHandler):
    def get(self):
        content = Build_Page("")
        self.response.write(content)
    
    def post(self):
        # look inside the request to figure out what the user typed
        have_error = False
        username = self.request.get("username")
        password = self.request.get("password")
        verify_password = self.request.get("verify_password")
        email = self.request.get("email")
    
        params = dict(username = username,
                      email = email)
    
        # if the user typed nothing at all, redirect
        if (not username) or (username.strip() == ""):
            #error = "Please enter a valid username."
            #self.response.write(error)
            #self.redirect("/?error=" + cgi.escape(error, quote=True))
            params['error_username'] = "Please enter a valid username."
            have_error = True
    
        if (not password) or (password.strip() == ""):
            #error = "Please enter a username."
            #self.response.write(error)
            #self.redirect("/?error=" + cgi.escape(error, quote=True))
            params['error_password'] = "Please enter a valid password."
            have_error = True
    
        if have_error:
            self.render('signup-form.html', **params)
        else:
            self.redirect('/unit2/welcome?username=' + username)
    
    import webapp2
    import cgi
    import re
    
    form = """
    <h1>User Signup</h1>
    <form method = "post">
    <table>
    <tr>
    <td>
    <label>Username: <input type="text" name="username"/></label>
    </td>
    <td>
    <label style="color:red">{username_message}</label>
    </td>
    </tr>
    
    <tr>
    <td>
    <label>Password: <input type="text" name="password"/></label>
    <td>
    <label style="color:red">{password_message}</label>
    </td>
    </td></tr>
    
    <tr>
    <td>
    <label>Verify Password: <input type="text" name="verify_password"/>
    </label>
    
    <td> 
    <label style="color:red">{password_match_message}</label>
    </td>
    </td></tr>
    
    <tr>
    <td>
    <label>Email (optional): <input type="text" name="email"/></label>
    <td>
    <label style="color:red">{email_message}</label>
    </td>
    </td></tr>
    
    </table>
    <input type = 'submit'/>
    </form>
    """   
    
    同样在MainHandler类中,您希望创建一个helper函数,该函数的参数最初将变量设置为空字符串

    class MainHandler(webapp2.RequestHandler):
    def helper(self, user_message="", user_password="", match_password="",
    user_email=""):
    #string substitution
       self.response.write(form.format(username_message= user_message, 
                                  password_message= user_password, 
                                  password_match_message= match_password,
                                  email_message= user_email
                                  ))
    
    有关字符串替换的更多信息,请参见这些链接(这就是“.format”的作用):

    接下来使用get方法获取表单中输入的信息。使用您创建的helper函数获取为变量输入的信息

    def get(self):
        self.helper()
    
    现在在post方法中,您将查看请求内部,以了解用户键入的内容

    def post(self):
        # look inside the request to figure out what the user typed
        username = self.request.get("username")
        password = self.request.get("password")
        verify_password = self.request.get("verify_password")
        email = self.request.get("email")
    
        params = dict(username = username,
                      email = email) 
    
    然后,您将创建if语句来测试是否满足了需求。首先,您需要创建一个场景,其中用户满足所有需求。在这种情况下,您需要将它们重定向到欢迎页面

    #if valid_username(username) == "" or ! valid_username
        user_message="" 
        user_password=""
        match_password=""
        user_email=""
        if valid_username(username) and valid_password(password) and equal_password(password, verify_password) and valid_email(email):
            self.redirect('/welcome?username=' + username)
    
    然后,您将设置用户不满足要求时的if语句:

        if not valid_username(username):
            user_message="Username not valid"
        if not valid_password(password):
            user_password="Password not valid"
        if not equal_password(password, verify_password):
            match_password="Passwords must match"
        if email is not "" and not valid_email(email):
            user_email="Please enter a valid email"           
    
        self.response.write(form.format(username_message= user_message, 
                                  password_message= user_password, 
                                  password_match_message= match_password,
                                  email_message= user_email
                                  ))
    
    如果用户输入了正确的信息,您将希望重定向到欢迎页面。创建一个新类
    Welcome
    ,该类通过获取用户输入的用户名来定义要编写的内容

    class Welcome(webapp2.RequestHandler):
       def get(self):
            username = self.request.get('username')
            if valid_username(username):
                 self.response.write(welcome.format(username = username))
    
    #html for welcome page            
    welcome = """
    <!DOCTYPE html>
    
    <html>
    <head>
        <title>
        User Signup
        </title>
    </head>
    
    <body>
    #string substitution for username 
    <h2>Welcome, {username}!</h2>
    </body>
    </html>
    """
    
        if not valid_username(username):
            user_message="Username not valid"
        if not valid_password(password):
            user_password="Password not valid"
        if not equal_password(password, verify_password):
            match_password="Passwords must match"
        if email is not "" and not valid_email(email):
            user_email="Please enter a valid email"           
    
        self.response.write(form.format(username_message= user_message, 
                                  password_message= user_password, 
                                  password_match_message= match_password,
                                  email_message= user_email
                                  ))
    
    class Welcome(webapp2.RequestHandler):
       def get(self):
            username = self.request.get('username')
            if valid_username(username):
                 self.response.write(welcome.format(username = username))
    
    #html for welcome page            
    welcome = """
    <!DOCTYPE html>
    
    <html>
    <head>
        <title>
        User Signup
        </title>
    </head>
    
    <body>
    #string substitution for username 
    <h2>Welcome, {username}!</h2>
    </body>
    </html>
    """
    
    app = webapp2.WSGIApplication([
    ('/', MainHandler),
    ('/welcome', Welcome)
    ], debug=True)