简体   繁体   English

Google App引擎-代码中的错误

[英]Google app engine - Bugs in the code

My code is this: 我的代码是这样的:

import webapp2
import re
form = """<html>
<form method=post>
<input name="username"><div id=div>%s</div><br>
<input name="password"><div id=div>%s</div><br>
<input name="verify"><div id=div>%s</div><br>
<input name="email"><div id=div>%s</div>
<input type="submit">
</form>
</html>"""
class MainPage(webapp2.RequestHandler):
  def get(self):
      self.response.headers['Content-Type'] = 'text/html'
      self.response.write(form % ('','','',''))

  def reply(self,user,password,verify,email):
      if not user and password and verify and email:
        self.redirect('/broski')
      else:
        self.response.write(form % (user,password,verify,email))

  def post(self):
      self.usererror = ''
      if not re.compile(r"^[a-zA-Z0-9_-]{3,20}$").match(self.request.get('username')):
       self.usererror = "That's not a valid username."
      self.passworderror = ''
      if not re.compile(r"^.{3,20}$").match(self.request.get('password')):
        self.passworderror = "That wasn't a valid password."
      self.verifyerror = ''
      if self.request.get('verify') != self.request.get('password') and self.request.get('password') != '':
        self.verifyerror = "Your passwords didn't match."
      self.emailerror = ''
      if not re.compile(r"^[\S]+@[\S]+\.[\S]+$").match(self.request.get('email')):
        self.emailerror = "That's not a valid email."
      self.reply(usererror,passworderror,verifyerror,emailerror)

class ThankYo(webapp2.RequestHandler):
  def get(self):
      self.response.write('Welcome, ' + self.request.get('username')+'!')

app = webapp2.WSGIApplication([('/', MainPage),('/broski', ThankYo)],
                              debug=True)

It is literally my first time writing a code for GAE(And im new to python..) larger than 10 lines and, ofcourse, he broke. 从字面上看,这是我第一次为大于10行的GAE(也是python的新手)编写代码,当然,他破产了。 I found several bugs but to absolutely on help as the website still doesnt even load. 我发现了几个错误,但由于网站仍然没有加载,因此绝对无法获得帮助。 Help regarding the code is highly appreciated. 非常感谢您提供有关代码的帮助。 Update: I updated it a little bit more(Changed inheritance of ThankYo) and now the form successfully loads, as soon as i post the data ofcourse it crashes... 更新:我更新了一点(改变了ThankYo的继承),现在表单成功加载,一旦我发布课程数据便崩溃了...

class ThankYo(Mainpage):

should be 应该

class ThankYo(MainPage):

(note the capital P ). (注意大写P )。


I found this by looking at the error messages left in the terminal: 我通过查看终端中剩余的错误消息发现了这一点:

% dev_appser  File "/home/unutbu/pysrc/project/main.py", line 38, in <module>
...
    class ThankYo(Mainpage):   
NameError: name 'Mainpage' is not defined

Also change 也改变

self.reply(usererror,passworderror,verifyerror,emailerror)

to

self.reply(self.usererror, self.passworderror, self.verifyerror, self.emailerror)

I found this again by looking at the terminal error message: 我通过查看终端错误消息再次发现了这一点:

  File "/home/unutbu/pysrc/project/main.py", line 39, in post
    self.reply(usererror, passworderror, verifyerror, emailerror)
NameError: global name 'usererror' is not defined

How to see error messages (from the terminal): 如何查看错误消息(从终端):

There is more than one way to start the GAE server. 启动GAE服务器有多种方法。 The way I do it is by opening a terminal and running 我的方法是打开终端并运行

dev_appserver.py /path/to/project/

The terminal then spews useful error messages. 然后,终端会弹出有用的错误消息。


The last problem is a bit more complex. 最后一个问题要复杂一些。 We are sending error messages to the reply method: 我们正在发送错误信息到reply方法:

self.reply(self.usererror, self.passworderror, self.verifyerror, self.emailerror)

But in the reply method definition we call them user , password , verify and email . 但是在reply方法定义中,我们称它们为userpasswordverifyemail That causes a bit of cognitive dissonance. 这会导致一些认知失调。 Let's rename them usererror , passworderror , verifyerror and emailerror : 让我们将它们重命名为usererrorpassworderrorverifyerroremailerror

def reply(self, usererror, passworderror, verifyerror, emailerror):

Now to check that there are no errors use: 现在要检查是否没有错误,请使用:

if not any(usererror and passworderror and verifyerror and emailerror):

But the page we want to redirect to needs the name of the user! 但是我们要重定向到的页面需要用户名! If we just redirect to /broksi : 如果我们只是重定向到/broksi

        self.redirect('/broski')

then the ThankYo handler has no idea what the username is. 然后ThankYo处理程序不知道用户名是什么。 self.request.get('username') would come up blank (return an empty string). self.request.get('username')self.request.get('username')空白(返回一个空字符串)。 So we need to pass along the username to broski : 因此,我们需要将用户名传递给broski

import urllib

self.redirect('/broski?' + urllib.urlencode(
            {'username' : self.username}))

So the code ends up looking like this: 因此,代码最终看起来像这样:

import urllib
import webapp2
import re
form = """<html>
<form method=post>
<input name="username"><div id=div>%s</div><br>
<input name="password"><div id=div>%s</div><br>
<input name="verify"><div id=div>%s</div><br>
<input name="email"><div id=div>%s</div>
<input type="submit">
</form>
</html>"""


class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/html'
        self.response.write(form % ('', '', '', ''))

    def reply(self, usererror, passworderror, verifyerror, emailerror):
        if not any(usererror and passworderror and verifyerror and emailerror):
            self.redirect('/broski?' + urllib.urlencode(
                {'username' : self.username}))
        else:
            self.response.write(form % (user, password, verify, email))

    def post(self):
        self.username = self.request.get('username')
        self.password = self.request.get('password')
        self.verify = self.request.get('verify')
        self.email = self.request.get('email')
        self.usererror = ''
        if not re.compile(r"^[a-zA-Z0-9_-]{3,20}$").match(self.username):
            self.usererror = "That's not a valid username."
        self.passworderror = ''
        if not re.compile(r"^.{3,20}$").match(self.password):
            self.passworderror = "That wasn't a valid password."
        self.verifyerror = ''
        if self.verify != self.password and self.password != '':
            self.verifyerror = "Your passwords didn't match."
        self.emailerror = ''
        if not re.compile(r"^[\S]+@[\S]+\.[\S]+$").match(self.email):
            self.emailerror = "That's not a valid email."
        self.reply(self.usererror, self.passworderror, self.verifyerror, self.emailerror)


class ThankYo(MainPage):
    def get(self):
        self.response.write('Welcome, ' + self.request.get('username') + '!')

app = webapp2.WSGIApplication([('/', MainPage), ('/broski', ThankYo)],
                              debug=True)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM