【问题标题】:How to redirect in webapp2如何在 webapp2 中重定向
【发布时间】:2014-12-01 04:46:58
【问题描述】:

你好我正在学习 webapp2 ,我怀疑是有三个页面 1: /blog 用于查看所有链接到其永久链接的博客 2:/blog/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)], 

【问题讨论】:

标签: google-app-engine python-2.7 webapp2


【解决方案1】:

在您提供的代码中没有任何明显的迹象表明存在错误。由于MainPage 请求处理程序中的重定向确实正确重定向并加载了博客文章,我怀疑问题在于您如何在BlogPostHandler 使用的jinja2 模板中创建链接。以下是一些需要注意的事项:

  • 链接使用/blog/ 而不是/blogs/(复数)。
  • 链接中出现意外空格:/blog/ 1234
  • 您使用的是绝对链接而不是相对链接。
    • 绝对:href="/blog/{{ post.id }}"(领先/
    • 相对:href="blog/{{ post.id }}"(没有前导/,它将链接到/blog/blog/<id>
  • 博客文章 ID 呈现为整数而不是长整数,在使用 Google App Engine 的数据存储区时可能会发生这种情况。
    • 整数:/blog/1234
    • 长:/blog/1234L

【讨论】:

    【解决方案2】:

    也许值得一提,在第一个回复中添加:选择extended routes 时可能会享受更大的灵活性:

    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/&lt;:.*&gt;'

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多