你好,我正在学习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)],
您提供的代码中没有任何明显的内容表明存在错误。由于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
- 整数:
也许值得一提,补充第一个回复:在选择扩展路线时,可能会享受更大的灵活性:
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/<:.*>'
。