Python 谷歌应用引擎:从数据库检索数据
我正在尝试构建一个简单的博客应用程序,以使用我从Udacity学到的技能。但是,从数据库检索数据并向用户显示数据时遇到问题。现在,我的博客有一个永久链接,它显示用户刚刚提交的帖子,还有一个主博客页面,它将按降序显示最近10篇帖子。但是当我提交帖子时,帖子成功地存储在数据库中,我被重定向到永久链接。然而,我得到的只是一个空白页,而不是我刚刚提交的帖子 此外,当我返回到我的主博客页面时,我看到的不是用户提交的所有帖子: 以下是主要的python代码:Python 谷歌应用引擎:从数据库检索数据,python,html,google-app-engine,web-applications,blogs,Python,Html,Google App Engine,Web Applications,Blogs,我正在尝试构建一个简单的博客应用程序,以使用我从Udacity学到的技能。但是,从数据库检索数据并向用户显示数据时遇到问题。现在,我的博客有一个永久链接,它显示用户刚刚提交的帖子,还有一个主博客页面,它将按降序显示最近10篇帖子。但是当我提交帖子时,帖子成功地存储在数据库中,我被重定向到永久链接。然而,我得到的只是一个空白页,而不是我刚刚提交的帖子 此外,当我返回到我的主博客页面时,我看到的不是用户提交的所有帖子: 以下是主要的python代码: import os import re imp
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代码:
{% extends "base.html" %}
{% block content %}
{% for p in posts %}
{{ p.render() | safe }}
<br><br>
{% endfor %}
{% endblock %}
{%extends“base.html”%}
{%block content%}
{%p在posts%}
{{p.render()| safe}}
{%endfor%}
{%endblock%}
我已经为此挣扎了两天多了。我在日志中也没有看到bug。有什么问题吗
编辑:
根据下面的答案编辑源代码。但是,我仍然收到一个404错误。您正在使用一个父密钥创建Blogger实体,当您试图在
DisplayPost
中检索您的帖子时,您没有指定该父密钥
实体的键由多个部分组成。它是种类(“Blogger”
),它是ID(int(post\u ID)
),也是它的祖先或父代
因为您创建实体时使用了:
a = Blogger(parent = post_key(), name = name, content = content)
调用get\u by\u id()
()时,需要指定相同的父级
你的解决办法是改变
po = Blogger.get_by_id(int(post_id))
到
稍后,如果更改博客的名称(查看post_key()的代码),则需要将其作为参数传递给post显示机制。(例如,您可以使用子域作为博客的“名称”)
以下是先前解决regex URL映射问题的答案: 在您的
WSGIApplication
定义中,您有('/blog/([0-9]+)',DisplayPost)],debug=True)
您缺少url字符串前面的r
,无法将该字符串标识为正则表达式:
(r'/blog/([0-9]+),…
您还可以选择使用参数命名更加详细:
(r'/blog/,…
参考资料:不完全重复。代码不同。而且,这里的问题与我在那篇文章中提到的代码完全不同。这里的问题似乎是从数据库中检索条目。否则,代码工作得非常好,没有任何错误。只需提一下,
[0-9]的正则表达式
也可能是\d
进行了必要的更改。但是,我现在在提交帖子并重定向到永久链接时出现了404错误。我已将上面修改的代码包含在编辑的部分下。根据您的代码判断,我在您的正则表达式中看到一个缺少的
。r'/blog/404资源再次找不到!@ManasChaturvedi我明白为什么了,我已经更新了帖子,加入了关于丢失父密钥的问题。很抱歉,我花了这么长时间才明白!(:
a = Blogger(parent = post_key(), name = name, content = content)
po = Blogger.get_by_id(int(post_id))
po = Blogger.get_by_id(int(post_id), parent=post_key())