我正在尝试构建一个简单的博客应用程序,以使用我从Udacity到目前为止所学到的技能。但是,我无法从数据库中检索数据并为用户显示数据。现在,我的博客有一个固定链接,显示用户刚刚提交的帖子,还有主要博客页面,它将按降序显示最新的10个帖子。但是当我提交帖子时,帖子成功存储在数据库中,我被重定向到永久链接。但是,我得到的只是一个空白页而不是我刚刚提交的帖子。
另外,当我回到我的主要博客页面时,我看到的是这个而不是用户提交的所有帖子:
这是主要的python代码:
import os
import re
import webapp2
import jinja2
from string import letters
from google.appengine.ext import db
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape=True)
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
return render_str(template, **params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
def render_post(response, post):
response.out.write('<b>' + post.subject + '</b><br>')
response.out.write(post.content)
def post_key(name = "dad"):
return db.Key.from_path('blog', name)
class Blogger(db.Model):
name = db.StringProperty()
content = db.TextProperty()
created = db.DateTimeProperty(auto_now_add = True)
def render(self):
self._render_text = self.content.replace('\n', '<br>')
return render_str("post.html", p = self)
class MainPage(Handler):
def get(self):
self.response.write("Visit our blog")
class BlogHandler(Handler):
def get(self):
posts = db.GqlQuery("SELECT * FROM Blogger order by created desc")
self.render("frontblog.html", posts = posts)
class SubmitHandler(Handler):
def get(self):
self.render("temp.html")
def post(self):
name = self.request.get("name")
content = self.request.get("content")
if name and content:
a = Blogger(parent = post_key(), name = name, content = content)
a.put()
self.redirect('/blog/%s' % str(a.key().id()))
else:
error = "Fill in both the columns!"
self.render("temp.html", name = name, content = content, error = error)
class DisplayPost(Handler):
def get(self, post_id):
post_id = self.request.get("post_id")
if post_id:
po = Blogger.get_by_id(int(post_id), parent = post_key())
if po:
self.render("perma.html", po = po)
self.response.write("No")
app = webapp2.WSGIApplication([('/', MainPage),
('/blog', BlogHandler),
('/blog/submit', SubmitHandler),
(r'/blog/<post_id:([0-9]+)>', DisplayPost)], debug=True)
以下是所有HTML页面基础的HTML代码:
<!DOCTYPE html>
<html>
<head>
<link type="text/css" rel="stylesheet" href="/static/main.css" />
<title>CS 253 Blog</title>
</head>
<body>
<a href="/blog" class="main-title">
CS 253 Blog
</a>
<div id="content">
{% block content %}
{% endblock %}
</div>
</body>
</html>
以下是永久链接页面的HTML代码:
{% extends "base.html" %}
{% block content %}
{{po.render() | safe}}
{% endblock %}
博客前面的HTML代码:
{% extends "base.html" %}
{% block content %}
{% for p in posts %}
{{ p.render() | safe }}
<br><br>
{% endfor %}
{% endblock %}
我这两天来一直在努力奋斗。我也看不到日志中的错误。什么似乎是问题?
编辑:
根据以下答案编辑源代码。但是,我仍然收到404错误。
答案 0 :(得分:1)
您正在创建Blogger实体,其中包含您在DisplayPost
尝试检索帖子时未指定的父键。
实体的密钥由多个部分组成。它的种类("Blogger"
),它的ID(int(post_id)
),也是它的祖先或父母。
因为您使用以下内容创建实体
a = Blogger(parent = post_key(), name = name, content = content)
您需要在调用get_by_id()
(see the get_by_id() docs)时指定相同的父级。
您的解决方案是改变
po = Blogger.get_by_id(int(post_id))
到
po = Blogger.get_by_id(int(post_id), parent=post_key())
稍后,如果您更改博客的名称(查看post_key()的代码),那么您需要将其作为后置显示机制的参数。 (例如,您可以使用子域作为博客的“名称”。)
以下是解决正则表达式URL映射问题的上一个答案:
在WSGIApplication
定义中,您有('/blog/([0-9]+)', DisplayPost)], debug=True)
。
您错过了url字符串前的r
,以将字符串标识为正则表达式:
(r'/blog/([0-9]+), ....
您还可以选择使用参数命名来更详细:
(r'/blog/<post_id:([0-9]+)>, ....