2013-05-21 51 views
3

我一直在关注this来自谷歌网站的例子,我在理解底层事情的一些工作方面遇到了一些麻烦。大多数情况下,当您提交文本时,在MainHandler HTML中,它如何知道使用GuestBook?我认为它与<form action="/sign" method=post>('/sign', GuestBook)有关,但我不完全确定它是如何工作的。谷歌应用引擎中的HTML

from google.appengine.ext import db 
import webapp2 

class Greeting(db.Model): 
    content = db.StringProperty(multiline=True) 
    date = db.DateTimeProperty(auto_now_add=True) 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.write('Hello world!') 
     self.response.write('<h1>My GuestBook</h1><ol>') 
     #greetings = db.GqlQuery("SELECT * FROM Greeting") 
     greetings = Greeting.all() 
     for greeting in greetings: 
      self.response.write('<li> %s' % greeting.content) 
     self.response.write(''' 
      </ol><hr> 
      <form action="/sign" method=post> 
      <textarea name=content rows=3 cols=60></textarea> 
      <br><input type=submit value="Sign Guestbook"> 
      </form> 
     ''') 

class GuestBook(webapp2.RequestHandler): 
    def post(self): 
     greeting = Greeting() 
     greeting.content = self.request.get('content') 
     greeting.put() 
     self.redirect('/') 

app = webapp2.WSGIApplication([ 
    ('/', MainHandler), 
    ('/sign', GuestBook), 
], debug=True) 

回答

2

你是对的!的路由被配置在下面的块:

app = webapp2.WSGIApplication([ 
    ('/', MainHandler), 
    ('/sign', GuestBook), 
], debug=True) 

因此,当存在要/sign的请求时,一个新的GuestBook实例被创建,并且使用适当的方法被调用,所述GuestBook实例(其中包含对所述请求的参考)作为第一个参数。在你的例子中,它是一个POST,但是webapp2支持所有流行的http方法,如http://webapp-improved.appspot.com/guide/handlers.html

+0

中记录的那样,添加一些关于类的实例创建的细节,然后调用'post(..)'或'得到(..)'(酌情)会使它更好的回答:) – SuperSaiyan

+0

@Thrustmaster好主意!感谢您的反馈:) – Andbdrew

+2

添加到@ Andbdrew的答案,GAE本身并不知道webapp2的路由。 GAE自己的路由配置位于'app.yaml'文件中,该文件应该指向一个包含WSGI处理程序的变量(在本例中为'app') –