博客应用引擎系统中的评论
最近我读了《Core Python》这本书中关于App Engine的章节,并实现了书中提供的博客示例。
我想在这个示例中增加评论功能,让用户可以在博客文章下留言,但我遇到了一些困难。
我有两个模型:
BlogPost(标签、内容、时间戳)- 这是一个表,用来存储博客的标签、内容和创建时间。
Comment(博客文章、内容)- 这里的博客文章是一个引用属性,指向BlogPost模型,用来将评论和相关的博客文章关联起来。
我遇到的困难是如何获取BlogPost的键,以便正确地将用户输入的评论与对应的博客文章关联起来。我在想,我应该先查询博客文章,获取它们的键,然后把这些键放到用户创建的新评论中(当然,前提是评论确实被创建了)。但此刻我还不太明白该如何一步步编写这些代码。
换句话说,我需要做一些与这里的“一对多”解释相关的事情 - https://developers.google.com/appengine/articles/modeling。但我需要根据我的实现来做,生成用户在我的HTML表单中输入的实例模型。
下面是我现在正在处理的代码,感谢任何帮助。
//app.yaml
application: src
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico
- url: .*
script: main.app
和
//main.py
import webapp2
from google.appengine.ext import db
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.out.write('''
<h1>The Blog Posts</h1>
<form action="/post" method=post>
Title:
<br><input type=text name=title>
<br>Body:
<br><textarea name=body rows=3 cols=60></textarea>
<br><input type=submit value="Post">
</form>
<hr>
''')
#posts = db.GqlQuery("SELECT * FROM BlogEntry")
posts = BlogPost.all().order('-timestamp').fetch(10)
for post in posts:
self.response.out.write('''<hr>
<strong>%s</strong><br>%s
<blockquote>%s</blockquote>''' % (
post.title, post.timestamp, post.body)
)
class BlogEntry(webapp2.RequestHandler):
def post(self):
post = BlogPost()
post.title = self.request.get('title')
post.body = self.request.get('body')
post.put()
self.redirect('/')
#model
class BlogPost(db.Model):
title = db.StringProperty()
body = db.TextProperty()
timestamp = db.DateTimeProperty(auto_now_add=True)
app = webapp2.WSGIApplication([
('/', MainHandler),
('/post', BlogEntry)
], debug=True)
2 个回答
在NDB中,如果你的评论有额外的字段,可以使用重复属性或重复结构属性。重复属性就像Python中的列表,你可以把所有的博客评论放在里面。而且你只需要一次读取就可以获取所有评论。
一种设计方式是为每个博客文章设置一个评论表单。这样,你可以在表单中加入一个隐藏字段,里面放着这个博客文章的关键字。为了让你的首页看起来不那么杂乱,你可能希望为每个博客文章创建一个单独的页面,在这个页面上用户可以提交他们的评论。
这个设计的一个例子可以在这里找到: https://bitbucket.org/abernier/yab/src 相关的代码部分在 PostHandler
的 /views.py
文件中,而对应的标记代码在 /templates/view.html
文件中。