Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 谷歌应用引擎:从数据库检索数据_Python_Html_Google App Engine_Web Applications_Blogs - Fatal编程技术网

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

我正在尝试构建一个简单的博客应用程序,以使用我从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代码:

{% 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())