Как перенаправить в webapp2

Здравствуйте, я изучаю webapp2, я сомневаюсь, что есть три страницы 1: /blog для просмотра всех опубликованных блогов, которые связаны с их постоянной ссылкой 2: /blog/newpost для получения newpost для блога, он содержит только заголовок и блог в качестве входных данных в то время как пользователь нажимает кнопку "Отправить", он перенаправляет на некоторую постоянную ссылку (это работает!!!) 3: и последний - /blog/(somepermalink), где пользователь перенаправляется на эту страницу на шаге 2

Моя проблема - первая страница, где представлен весь список созданных блогов, и когда пользователь нажимает на какой-нибудь блог, я хочу перенаправить его на шаг 3, но, к сожалению, он дает мне ошибку 404. Вот мои коды

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

 class Blog(db.Model):
   title = db.StringProperty(required = True)
   blog = db.TextProperty(required = True)
   created = db.DateTimeProperty(auto_now_add = True) 


 class MainPage(Handler):
   def render_front(self, title="", blog="", error=""):
     self.render("newpost.html", title=title, blog=blog, error=error)

   def get(self):
     self.render_front()

   def post(self):
     title = self.request.get("title")
     blog = self.request.get("blog")

     if title and blog:
       a = Blog(title=title, blog=blog)
       a_key = a.put()
     #sleep is used because of replication lag time
       sleep(0.1)   
     #redirect to some permalink
       self.redirect("/blog/%d" % a_key.id())
    else:
      error = "both title and post are needed"
      self.render_front(title, blog, error)  


class BlogPostHandler(Handler):
   def render_blog(self, title="", blogs=""):
     blogs = db.GqlQuery("SELECT * FROM Blog ORDER BY created DESC")
     self.render("blogpage.html", title=title, blogs=blogs)

  def get(self):
    self.render_blog()

class PermaLink(MainPage):
  def get(self, blog_id):
    s = Blog.get_by_id(int(blog_id))
    self.render("blogpage.html", blogs = [s])


app = webapp2.WSGIApplication([('/blog',BlogPostHandler),
                           ('/blog/newpost',MainPage),
                           ('/blog/(\d+)', PermaLink)], 

2 ответа

Возможно, стоит упомянуть, добавив к первому ответу: можно выбрать большую гибкость при выборе расширенных маршрутов:

app = webapp2.WSGIApplication([
    webapp2.Route(r'/blog', handler=BlogPostHandler, name='BlogPost'),
    webapp2.Route(r'/blog/newpost', handler=MainPage, name='MainPage'),
    webapp2.Route(r'/blog/<:\d+>', handler=PermaLink, name='PermanentLink'),
])

Последняя строка выше указывает путь к / blog /, так же, как ваш исходный код. Если вы хотите указать любой возможный путь после / blog /, вы должны использовать Route r'/blog/<:.*>'вместо.

В предоставленном вами коде нет ничего очевидного, что указывало бы на наличие ошибки. Так как перенаправление в вашем MainPage обработчик запросов правильно перенаправляет и загружает сообщение в блоге, я подозреваю, что проблема в том, как вы создаете ссылки в шаблоне jinja2, используемом BlogPostHandler, Вот несколько вещей, на которые стоит обратить внимание:

  • Ссылки используют /blog/ вместо /blogs/ (Множественное число).
  • Случайный пробел в вашей ссылке: /blog/ 1234,
  • Вы используете абсолютные ссылки вместо относительных ссылок.
    • Абсолютные: href="/blog/{{ post.id }}" (ведущий /)
    • Родственник: href="blog/{{ post.id }}" (без ведущих /, который будет ссылаться на /blog/blog/<id>)
  • Идентификатор поста блога отображается как целое число, а не как длинный, что может произойти при использовании хранилища данных Google App Engine.
    • Integer: /blog/1234
    • Долго: /blog/1234L
Другие вопросы по тегам