簡體   English   中英

Google App Engine:從數據庫檢索數據

[英]Google App Engine: Retrieving data from database

我正在嘗試構建一個簡單的博客應用程序,以使用到目前為止從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錯誤。

您正在使用嘗試在DisplayPost檢索帖子時未指定的父鍵創建Blogger實體。

實體的密鑰由多個部分組成。 它是種類( "Blogger" ),它的ID( int(post_id) ),也是祖先或父代。

因為您使用以下方法創建實體:

a = Blogger(parent = post_key(), name = name, content = content)

調用get_by_id()時,需要指定同一父get_by_id()請參閱get_by_id()文檔 )。

您的解決方案將是改變

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]+)>, ....

參考: http : //webapp-improved.appspot.com/guide/routing.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM