博客应用引擎系统中的评论

0 投票
2 回答
682 浏览
提问于 2025-04-17 13:44

最近我读了《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 个回答

0

在NDB中,如果你的评论有额外的字段,可以使用重复属性或重复结构属性。重复属性就像Python中的列表,你可以把所有的博客评论放在里面。而且你只需要一次读取就可以获取所有评论。

1

一种设计方式是为每个博客文章设置一个评论表单。这样,你可以在表单中加入一个隐藏字段,里面放着这个博客文章的关键字。为了让你的首页看起来不那么杂乱,你可能希望为每个博客文章创建一个单独的页面,在这个页面上用户可以提交他们的评论。

这个设计的一个例子可以在这里找到: https://bitbucket.org/abernier/yab/src 相关的代码部分在 PostHandler/views.py 文件中,而对应的标记代码在 /templates/view.html 文件中。

撰写回答