Python webapp2:获取请求时未定义用户名

Python webapp2:获取请求时未定义用户名,python,google-app-engine,webapp2,Python,Google App Engine,Webapp2,我正在google app engine上学习使用webapp2进行web编程,并遵循关于udacity的教程(已存档,因此学生社区在那里不活动)。有人能告诉我为什么我的代码中没有定义用户名吗 Traceback (most recent call last): File "/home/tekforce/Desktop/google_appengine/google/appengine/runtime/wsgi.py", line 239, in Handle handler = _

我正在google app engine上学习使用webapp2进行web编程,并遵循关于udacity的教程(已存档,因此学生社区在那里不活动)。有人能告诉我为什么我的代码中没有定义用户名吗

Traceback (most recent call last):
  File "/home/tekforce/Desktop/google_appengine/google/appengine/runtime/wsgi.py", line 239, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/home/tekforce/Desktop/google_appengine/google/appengine/runtime/wsgi.py", line 298, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/home/tekforce/Desktop/google_appengine/google/appengine/runtime/wsgi.py", line 84, in LoadObject
    obj = __import__(path[0])
  File "/home/tekforce/Desktop/helloUdacity/hello-udacity.py", line 40, in <module>
    class LoginPage(webapp2.RequestHandler):
  File "/home/tekforce/Desktop/helloUdacity/hello-udacity.py", line 66, in LoginPage
    if not valid_username(username):
NameError: name 'username' is not defined
INFO     2014-02-03 22:07:26,452 module.py:612] default: "GET / HTTP/1.1" 500 -
回溯(最近一次呼叫最后一次):
文件“/home/tekforce/Desktop/google_appengine/google/appengine/runtime/wsgi.py”,第239行,在Handle中
handler=\u config\u handle.add\u wsgi\u中间件(self.\u LoadHandler())
文件“/home/tekforce/Desktop/google\u appengine/google/appengine/runtime/wsgi.py”,第298行,在LoadHandler中
处理程序,路径,err=LoadObject(self.\u处理程序)
LoadObject中的文件“/home/tekforce/Desktop/google_appengine/google/appengine/runtime/wsgi.py”,第84行
obj=\uuuuuuuuuuuuuu导入(路径[0])
文件“/home/tekforce/Desktop/helloUdacity/hello udacity.py”,第40行,在
类登录页面(webapp2.RequestHandler):
文件“/home/tekforce/Desktop/helloUdacity/hello udacity.py”,第66行,登录页面
如果无效,\u用户名(用户名):
名称错误:未定义名称“username”
INFO 2014-02-03 22:07:26452 module.py:612]默认值:“GET/HTTP/1.1”500-
下面是我的python代码,我正在尝试执行

import webapp2
import cgi
import re


def escape_html(s):
    return cgi.escape(s, quote=True)

form = """
        <!DOCTYPE html>
        <html>
        <head>
        <title>Unit 2 Rot 13</title>
        </head>
        <body>
        <h2>Enter some text to ROT13:</h2>
        <form method="post">
        <textarea name="text" style="height: 100px; width: 400px; ">
        %(text)s
        </textarea>
        <br>
        <input type="submit">
        </form>
        </body>
        </html>
       """

class MainPage(webapp2.RequestHandler):

    def write_form(self, text = ''):
        self.response.out.write(form % {'text': escape_html(text)})

    def get(self):
        self.write_form()

    def post(self):
        content = self.request.get('text').encode('rot13')
        self.write_form(content)

class LoginPage(webapp2.RequestHandler):
    USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
    PASSWORD_RE = re.compile(r"^.{3,20}$")
    EMAIL_RE = re.compile(r"^[\S]+@[\S]+\.[\S]+$")

    @classmethod
    def valid_username(self,username):
        return username and LoginPage.USER_RE.match(username)

    @classmethod
    def valid_password(self,password):
        return password and LoginPage.PASSWORD_RE.match(password)

    @classmethod
    def valid_email(self, email):
        return not email or LoginPage.EMAIL_RE.match(email)

    def get(self):
        self.render("signup.html")

    def post(self):
        hasError = False
        username = self.request.get('username')
        password = self.request.get('password')
        verify = self.request.get('verify')
        email = self.request.get('email')

        # These params are send back to rendering,
        params = dict(username = username, email = email)

    if not valid_username(username):
        params['error_username'] = "Thats not a valid user name."
        hasError = True

    if not valid_password(password):
        params['error_username'] = "Thats not a valid password."
        hasError = True

    elif valid_password(password) != verify:
        params['error_verify'] = "Password do not match."
        hasError = True

    if not valid_email(email):
        params['error_email'] = "Thats not a valid email"
        hasError = True

    if hasError:
        self.render("signup.html",**params)
    else:
        self.redirect('/welcome?username='+username)

class Welcome(BaseHandler):
    def get(self):
        username = self.request.get('username')
    if LoginForm.valid_username(username):
        self.render('welcome.html',username = username)
    else:
        self.redirect('/sign')

app = webapp2.WSGIApplication([('/', MainPage),
                              ('/sign', LoginPage),
                              ('/welcome',welcome)],
                              debug=True)
导入webapp2
导入cgi
进口稀土
def escape_html:
返回cgi.escape(s,quote=True)
form=”“”
第二单元13
输入一些文本以执行以下操作:
%(文本)s

""" 类主页(webapp2.RequestHandler): def write_表单(self,text=''): self.response.out.write(格式%{'text':escape\uHTML(text)}) def get(自我): self.write_form() def post(自我): content=self.request.get('text').encode('rot13')) 自写表格(内容) 类登录页面(webapp2.RequestHandler): USER_RE=RE.compile(r“^[a-zA-Z0-9_u-]{3,20}$”) 密码\u RE=RE.compile(r“^.{3,20}$”) 电子邮件\u RE=RE.compile(r“^[\S]+@[\S]+\.[\S]+$”) @类方法 def有效_用户名(self,username): 返回用户名和登录页面。用户匹配(用户名) @类方法 def有效_密码(self,password): 返回密码和登录页面。密码匹配(密码) @类方法 def有效电子邮件(自我,电子邮件): 不返回电子邮件或登录页面。电子邮件匹配(电子邮件) def get(自我): self.render(“signup.html”) def post(自我): hasrerror=False username=self.request.get('username') password=self.request.get('password') verify=self.request.get('verify') email=self.request.get('email') #这些参数将被发送回渲染, params=dict(用户名=用户名,电子邮件=电子邮件) 如果无效,\u用户名(用户名): params['error_username']=“这不是有效的用户名。” hasrerror=True 如果密码无效(密码): params['error_username']=“这不是有效的密码。” hasrerror=True elif有效密码(密码)!=核实: 参数['error_verify']=“密码不匹配。” hasrerror=True 如果无效,请发送电子邮件(电子邮件): params['error_email']=“这不是有效的电子邮件” hasrerror=True 如果出现错误: render(“signup.html”,**参数) 其他: self.redirect('/welcome?username='+username) 类欢迎(BaseHandler): def get(自我): username=self.request.get('username') 如果LoginForm.valid\u用户名(username): self.render('welcome.html',username=username) 其他: self.redirect(“/sign”) app=webapp2.WSGIApplication([(“/”,主页), (“/签名”,登录页), (“/欢迎”,欢迎)], debug=True)
下面是我的signup.html代码

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sign Up</title>
<style type="text/css">
.label {text-align: right}
.error {color: red}
</style>
</head>
<body>
<h2>Signup</h2>
<form method="post">
<table>
<tbody><tr>
<td class="label">
Username
</td>
<td>
<input type="text" name="username" value="{{username}}">
</td>
<td class="error">
{{error_username}}
</td>
</tr>
<tr>
<td class="label">
Password
</td>
<td>
<input type="password" name="password" value="">
</td>
<td class="error">
{{error_password}}
</td>
</tr>
<tr>
<td class="label">
Verify Password
</td>
<td>
<input type="password" name="verify" value="">
</td>
<td class="error">
{{error_verify}}
</td>
</tr>
<tr>
<td class="label">
Email (optional)
</td>
<td>
<input type="text" name="email" value="{{email}}">
</td>
<td class="error">
{{error_email}}
</td>
</tr>
</tbody></table>
<input type="submit">
</form>
</body>
</html>

注册
.label{text align:right}
.错误{颜色:红色}
报名
用户名
{{error_username}}
暗语
{{error_password}}
验证密码
{{error_verify}}
电子邮件(可选)
{{error_email}}

看起来您的代码有误印(从上的下一行开始)

将代码再缩进一级(这样它就属于
post
函数),您应该可以解决这个问题

if not valid_username(username):