Google App Engine教程中的代码是怎么回事

时间:2009-09-24 08:25:44

标签: python google-app-engine

import cgi

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

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

class MainPage(webapp.RequestHandler):
  def get(self):
    self.response.out.write('<html><body>')

    greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")

    for greeting in greetings:
      if greeting.author:
        self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
      else:
        self.response.out.write('An anonymous person wrote:')
      self.response.out.write('<blockquote>%s</blockquote>' %
                              cgi.escape(greeting.content))

    # Write the submission form and the footer of the page
    self.response.out.write("""
          <form action="/sign" method="post">
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
      </html>""")

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/sign', Guestbook)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

我是Python新手,对此Google App Engine教程代码感到有些困惑。在Greeting类中,content = db.StringProperty(multiline = True),但在Guestbook类中,问候对象中的“content”被设置为greeting.content = self.request.get('content')。

我不明白如何在Greeting类和Guestbook类中设置“content”变量,但似乎保留了两个语句的值和属性。

3 个答案:

答案 0 :(得分:2)

第一段代码是模型定义:

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

它表示模型Greeting的{​​{1}}名称为StringProperty

在第二段代码中,您创建content模型的实例并为其Greeting属性

分配值
content

编辑:在评论中回答你的问题:这是基本的面向对象编程(或OOP),带有一些Python的特殊酱(描述符和元类)。如果您是OOP的新手,请阅读this article以更加熟悉这个概念(这是一个复杂的主题,OOP上有完整的库,所以除了在阅读一篇文章后了解所有内容之外)。你真的不需要知道描述符或元类,但它有时会派上用场。这是描述符的good introduction

答案 1 :(得分:2)

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

此代码指示ORM(对象关系映射器)在数据库中使用“author”,“content”和“date”字段创建表。请注意如何从db.Model继承Greeting类:它是要在数据库中创建的表的模型。

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

Guestbook是一个请求处理程序(注意它继承自哪个类)。在POST请求事件中调用请求处理程序的post()方法。此类中还可以有其他几种方法来处理不同类型的请求。现在注意post方法的作用:它实例化Greeting类 - 我们现在有一个实例,greeting对象。接下来,根据请求信息设置问候对象的“作者”和“内容”。最后,greeting.put()写入数据库。另外,请注意“日期”也会自动设置为将对象写入数据库的日期/时间。

答案 2 :(得分:0)

piquadrat的答案很好。您可以阅读有关App Engine模型here的更多信息。