如何用Jinja模板实现表单提交后重定向?GAE留言本页面改造问题
如何修改GAE留言本示例实现提交后重定向到greetings.html
我刚好熟悉这个Google App Engine的留言本示例,咱们一步步来调整实现你的需求:
1. 调整后端请求处理逻辑(Python代码)
原来的MainHandler同时处理了GET(显示表单+留言)和POST(处理提交)两个请求。现在咱们要把POST提交后的逻辑改成重定向到专门的留言展示页面,而不是直接在index页面渲染。
首先,在你的主Python文件(比如main.py)里新增一个GreetingsHandler,专门负责渲染greetings.html页面:
class GreetingsHandler(webapp2.RequestHandler): def get(self): # 和原示例MainHandler的GET逻辑一致,查询最新的10条留言 greetings_query = Greeting.query().order(-Greeting.date) greetings = greetings_query.fetch(10) # 用Jinja渲染greetings.html,把留言数据传递给模板 template = jinja_environment.get_template('greetings.html') self.response.write(template.render({'greetings': greetings}))
然后修改原MainHandler的POST方法,提交完成后直接重定向到新的留言展示路径:
class MainHandler(webapp2.RequestHandler): def get(self): # 现在GET请求只负责显示表单,不需要查询留言了 template = jinja_environment.get_template('index.html') self.response.write(template.render()) def post(self): greeting = Greeting() if users.get_current_user(): greeting.author = users.get_current_user() greeting.content = self.request.get('content') greeting.put() # 核心修改:提交后重定向到留言展示页面,而非渲染index self.redirect('/greetings')
2. 配置路由映射
在main.py的路由配置部分,新增/greetings的路由规则,指向咱们刚创建的GreetingsHandler:
app = webapp2.WSGIApplication([ ('/', MainHandler), ('/greetings', GreetingsHandler), # 新增这条路由 ], debug=True)
3. 确认greetings.html模板的变量一致性
你已经复制了index里的留言展示代码,只要确保模板里的变量名和后端传递的一致就行。比如greetings.html里应该保留类似这样的代码:
{% for greeting in greetings %} <div class="greeting"> {% if greeting.author %} <b>{{ greeting.author.nickname() }}</b> wrote: {% else %} An anonymous person wrote: {% endif %} <blockquote>{{ greeting.content }}</blockquote> </div> {% endfor %}
这里的greetings变量和后端GreetingsHandler传递的变量名完全匹配,就能正常渲染留言列表了。
4. 验证完整流程
现在的流程变成:
- 用户访问根路径
/,看到index.html里的留言表单 - 填写内容点击“签署留言本”,表单提交到
/的POST接口 - 后端存储留言后,自动重定向到
/greetings路径 GreetingsHandler查询最新留言,渲染greetings.html展示所有内容
如果遇到问题,比如页面404,先检查路由配置是否写错;如果留言不显示,确认GreetingsHandler的查询逻辑和原示例一致,模板变量名没有拼写错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

