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”变量,但似乎保留了两个语句的值和属性。
答案 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)