2013-11-13 2 views
0

Я пытаюсь создать простое приложение для блога, чтобы использовать навыки, которые я узнал от Udacity до сих пор. Однако у меня возникают проблемы с извлечением данных из базы данных и их отображением для пользователя. Теперь у моего блога есть постоянная ссылка, которая отображает сообщение, которое только что было отправлено пользователем, а также главную страницу блога, на которой будут отображаться последние 10 сообщений в порядке убывания. Но когда я отправляю сообщение, сообщение сохраняется в базе данных успешно, и я перенаправляюсь на постоянную ссылку. Тем не менее, все, что я получаю, - это пустая страница, а не почта, которую я только что представил.Google App Engine: извлечение данных из базы данных

Кроме того, когда я возвращаюсь к моей главной странице блога, я вижу это вместо того, чтобы все посты представляется пользователем:

enter image description here

Вот основной код питона:

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 %} 

я боролся с этим в течение двух дней в настоящее время. Я также не вижу ошибок в журналах. В чем проблема?


EDIT:

Отредактированный исходный код, основанный на ответах ниже. Тем не менее, я все еще получаю ошибку 404.

+0

Duplicate of [Google App Engine: 404 Ресурс не найден] (http://stackoverflow.com/questions/19925775/google-app-engine-404-resource-not-found) –

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

Вы пропускаете r перед строкой URL-адрес, чтобы идентифицировать строку как регулярное выражение:

(r'/blog/([0-9]+), ....

Вы также имеете возможность быть более многословным с параметр именования:

(r'/blog/<post_id:([0-9]+)>, ....

Справка: http://webapp-improved.appspot.com/guide/routing.html

+0

Просто, чтобы упомянуть это, ваше регулярное выражение '[0-9]' также могло быть '\ d' – Josh

+0

Сделал необходимые изменения. Однако теперь я получаю ошибку 404, когда я отправляю сообщение и перенаправляюсь на постоянную ссылку. Я включил пересмотренный код выше в отредактированном разделе. –

+0

Судя по вашему коду, я вижу недостающее '>' в вашем регулярном выражении. 'r '/ blog/'' – Josh

Смежные вопросы