2013-11-12 4 views
0

Я пытаюсь создать базовую модель блога с помощью Google App Engine в Python. Однако, что-то не так с моим кодом, я полагаю, и я получаю ошибку 404, когда я пытаюсь отобразить все опубликованные записи блога на одной странице. Вот код питона:Google App Engine: 404 Ресурс не найден

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) 

После размещения моего содержания, он перенаправляется на ссылку. Однако, это ошибка я получаю на подачу моего поста:

404 Not Found 
The resource could not be found 

Вот исходный код 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> 

Так в основном, я не перенаправляюсь на страницу постоянной ссылки. В чем проблема?

+0

1. Посмотрите на свой файл app.yaml, это приложение, зарегистрированное внутри? 2. действительно ли вы получаете данные о посылках? регистрировать данные сообщений для проверки. если вы удалите сообщения и покажете «привет мир», это покажет? Я не знаком с db, я использую ndb для своих приложений. – xialin

ответ

1

Когда вы создаете свой пост, вы даете ему родителя (не знаете почему). Но когда вы его получите, вы делаете это только по идентификатору и не принимаете во внимание родительский идентификатор. В хранилище данных ключ представляет собой путь, состоящий из всех родительских типов и идентификаторов/имен, а затем объектов текущего объекта и для получения объекта, которому необходимо передать полный путь.

Возможные решения здесь:

  • уронить родительский ключ, так как он ничего не делает здесь, как вы всегда установить его на ту же величину;
  • Используйте его, когда вы получаете объект: Blogger.get_by_id(post_id, parent=parent_key()) - очевидно, это работает только в том случае, если родитель всегда один и тот же;
  • Используйте полный строковый ключ в пути, а не только идентификатор, и сделайте Blogger.get(key) - вам также нужно будет изменить регулярное выражение маршрута, чтобы принять буквенно-цифровые символы, например '/blog/(\w+)', и изменить перенаправление на '/blog/%s' % a.key().
+0

Пробовал первые 2 решения. Тем не менее, я по-прежнему получаю ту же ошибку. Кроме того, я только заметил, что страница с ошибкой перенаправляется на «/ sub». Это путь ошибки по умолчанию? Потому что я нигде не сделал обработчика для этого пути. –

+0

Нет, по умолчанию нет пути 'sub'. Точно, где вы это понимаете? –

+0

, когда я отправляю имя и содержимое на страницу '/ blog/submit'. Вместо того, чтобы перенаправляться на страницу постоянной ссылки, я перенаправляюсь на «/ sub» и получаю сообщение об ошибке 404! –

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