Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 谷歌应用引擎:找不到404资源_Python_Database_Google App Engine - Fatal编程技术网

Python 谷歌应用引擎:找不到404资源

Python 谷歌应用引擎:找不到404资源,python,database,google-app-engine,Python,Database,Google App Engine,我正在尝试用Python中的GoogleAppEngine构建一个基本的博客模型。然而,我想我的代码有点问题,当我试图在一个页面上显示所有已发布的博客条目时,我遇到了404错误。下面是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

我正在尝试用Python中的GoogleAppEngine构建一个基本的博客模型。然而,我想我的代码有点问题,当我试图在一个页面上显示所有已发布的博客条目时,我遇到了404错误。下面是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)

class Handler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)
    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)
    def render(self, template, **kw):
        self.write(self.render_str(template, **kw))

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(name = name, content = content, parent = post_key())
            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):
        po = Blogger.get_by_id(int(post_id))
        if po:
            self.render("perma.html", po = po)
        else:
            self.response.write("404 Error")        

app = webapp2.WSGIApplication([('/', MainPage),
                          ('/blog', BlogHandler), 
                          ('/blog/submit', SubmitHandler),
                          ('/blog/([0-9]+)', DisplayPost)], debug=True)
以下是frontblog.html源代码,以防对您有所帮助:

<!DOCTYPE html>
<html>
<head>

  <title>CS 253 Blog</title>
</head>

<body>
  <a href="/blog">
    CS 253 Blog
  </a>

  <div id="content">
  {% block content %}
      {%for post in posts%}
        {{post.render() | safe}}
        <br></br>
      {%endfor%}
  {% endblock %}
  </div>
</body>

</html>

CS253博客
{%block content%}
{posts%%中的post为%s}
{{post.render()| safe}}


{%endfor%} {%endblock%}

所以基本上,我没有被重定向到permalink页面。有什么问题吗?

当你创建帖子时,你给了它一个家长(不知道为什么)。但是当你得到它时,你只需要ID,而不需要考虑父ID。在数据存储中,一个键实际上是一个由所有父种类和ID/名称组成的路径,然后是当前实体的ID/名称,要得到一个对象,你需要通过完整的路径

可能的解决办法如下:

  • 删除父键,因为它在这里没有任何作用,因为您总是将它设置为相同的值
  • 获取对象时使用它:
    Blogger.get\u by\u id(post\u id,parent=parent\u key())
    -显然,这只在父对象始终相同的情况下有效
  • 在路径中使用完整的字符串化键,而不仅仅是ID,然后执行
    Blogger.get(key)
    -您还需要更改路由正则表达式以接受字母数字字符,例如
    '/blog/(\w+)
    ,并将重定向更改为
    '/blog/%s'%a.key()

1。查看您的app.yaml文件,应用程序是否在其中注册?2.你真的得到posts数据吗?记录要检查的posts数据。如果你删除帖子并显示“hello world”,会显示吗?我不熟悉db,我在应用程序中使用ndb尝试了前两种解决方案。然而,我仍然得到同样的错误。另外,我刚刚注意到错误页面被重定向到“/sub”。这是默认的错误路径吗?因为我没有为该路径创建处理程序。没有,默认情况下没有
sub
path。你到底从哪里得到的?就在我在“/blog/submit”页面上提交姓名和内容的时候。我没有被重定向到permalink页面,而是被重定向到“/sub”并得到404错误消息!嗯,“sub”是“submit”的子字符串这一事实很有启发性,但我看不出是什么在起作用。我知道。真奇怪。另外,当我检查SDK时,我可以看到日志也没有存储在数据库中。
<!DOCTYPE html>
<html>
<head>

  <title>CS 253 Blog</title>
</head>

<body>
  <a href="/blog">
    CS 253 Blog
  </a>

  <div id="content">
  {% block content %}
      {%for post in posts%}
        {{post.render() | safe}}
        <br></br>
      {%endfor%}
  {% endblock %}
  </div>
</body>

</html>