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

时间:2017-02-03 21:14:15

标签: python forms function class post

请查看我在本地运行的网络应用的截图:

enter image description here

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

  1. 用户未输入用户名
  2. 用户名无效 - 包含空格字符,不在3到20个字符之间,和/或包含的字符不是“ta - z”,“ - Z”,“0 - 9”
  3. 密码无效 - 不在3到20个字符
  4. 之间
  5. 密码不匹配 - '验证密码'与'密码'
  6. 不同
  7. 电子邮件无效 - 必须与(r'^[\S]+@[\S]+\.[\]+$')匹配,这意味着一堆字符,一个@符号,一堆字符,一个句点和一堆字符。
  8. 正如您所看到的,我的代码当前正在显示加载页面时的错误消息,而不是在用户点击“提交”之后显示错误消息。

    由于here列出的原因,我无法在网站上托管此网络应用程序(我的托管服务,HostGator,不支持WebApp2,我也无法将存储库上传到Google Cloud)。

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

    https://github.com/user3546086/user-signup

    #!/usr/bin/env python
    #
    # Copyright 2007 Google Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    # implied.
    
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    import webapp2
    import cgi
    
    def Build_Page(textarea_content):
    
    form = """
    <table>
        <tr>
        <td>
        <label>{0}</label>
        </td>
        <td>
        <label>Username: <input type="text" name="username"/></label>
        </td></tr>
    
        <tr>
        <td>
        <label>{1}</label>
        </td>
        <td>
        <label>Password: <input type="text" name="password"/></label>
        </td></tr>
    
        <tr>
        <td> 
        <label>{2}</label>
        </td>
        <td>
        <label>Verify Password: <input type="text" name="verify_password"/>
        </label>
        </td></tr>
    
        <tr>
        <td>
        <label>{3}</label>
        </td>
        <td>
        <label>Email (optional): <input type="text" name="email"/></label>
        </td></tr>
    
        </table>
        """
        submit = "<input type = 'submit'/>"
        form2 = ("<form method='post'>" 
            + form + submit + "</form>").format("Please enter a valid
        username", "Please enter a valid password", "Your passwords must
        match", "Please enter a valid email")
    
        header = "<h1>User Signup</h1>" 
    
        return header + form2
    
    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
        username = self.request.get("username")
        password = self.request.get("password")
        verify_password = self.request.get("verify_password")
        email = self.request.get("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))
    
        if (not password) or (username.strip() == ""):
            error = "Please enter a username."
            self.response.write(error)
            self.redirect("/?error=" + cgi.escape(error, quote=True))
    
        """if (not username) or (username.strip() == ""):
            error = "Please enter a username."
            self.response.write(error)
            self.redirect("/?error=" + cgi.escape(error, quote=True))
    
        if (not username) or (username.strip() == ""):
            error = "Please enter a username."
            self.response.write(error)
            self.redirect("/?error=" + cgi.escape(error, quote=True))"""
    
        #              self.write.form2    
        #message = self.request.get("message") 
        # hello</textarea>hello
        #rotation = int(self.request.get("rotation")) 
        # 0 
        #encrypted_message = caesar.encrypt(message, rotation) 
        # hello</textarea>hello
        #escaped_message = cgi.escape(encrypted_message) 
        # hello&lt;/textarea&gt;hello
        #content = build_page(escaped_message)
        #self.response.write(content)
    
        #originalform = form.format("","","","","","")
        #page footer
    
        #class TestHandler(webapp2.RequestHandler):
        #    """ Handles requests coming in to '/add'
        #        e.g. www.user-signup.com/add
        #    """
        #    def get(self):
    
    app = webapp2.WSGIApplication([
        ('/', MainHandler),
        #('/', TestHandler)
    ], debug=True)
    

    此处还有带有所谓解决方案的视频,但我不允许使用他用于此项目的框架。

    https://www.youtube.com/watch?v=wHtUNPslte4

    我试图创造一个&#39; params&#39;变量就像他在我的MainHandler类中的post函数中所做的那样,但没有任何事情发生。所以我的MainHandler类现在看起来像这样:

    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)
    

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

1 个答案:

答案 0 :(得分:1)

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

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>
"""   

您可以看到我为不同的错误消息创建了变量名,并在表外创建了一个method =“post”的表单。将它转换为post表单允许我们稍后在MainHandler类中使用post函数。这就是您获取用户输入信息的方式,并将其与valid_usernamevalid_passwordvalid_email函数进行比较(这些函数是由教师在链接视频中创建的):

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
    return username and USER_RE.match(username)

PASS_RE = re.compile(r"^.{3,20}$")
def valid_password(password):
    return password and PASS_RE.match(password)

def equal_password(verify_password, password):
    if password == verify_password:
        return True
    else: 
        return False

EMAIL_RE = re.compile(r'^[\S]+@[\S\+\.[\S]+$')
def valid_email(email):
    return not email or EMAIL_RE.match(email)     

同样在MainHandler类中,您希望创建一个辅助函数,该函数具有最初将变量设置为空字符串的参数。

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'正在做的事情):

https://pyformat.info/

https://docs.python.org/2/library/string.html

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

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>
"""

最后,为您的主页和欢迎页面创建参数:

app = webapp2.WSGIApplication([
('/', MainHandler),
('/welcome', Welcome)
], debug=True)