【问题标题】:Python Flask render_template not rendering correctlyPython Flask render_template 未正确渲染
【发布时间】:2018-03-21 11:02:41
【问题描述】:

当有人退出我的页面时,我想在 HTML 中添加一个段落,Jinja 表示他们已成功退出。它一直有效到我实际返回 render_template。

 @app.route('/logout',methods=['POST'])
    def logout():
       session['logged_in'] = False
       message = "You have successfully logged out"
       return redirect(url_for('index_page',message=message))

 @app.route('/', methods=['POST','GET'])
 def index_page():
    try:
       session['logged_in']
       message = request.args['message']
       return render_template('index.html',message=message)
    except:
       session['logged_in'] = False
       return render_template('index.html')

当我在注销后在index_page 中打印message 时,它会正确打印出"You have successfully logged out",即使我打印render_template('index.html',message=message),它也会给出正确的HTML,其中message 应该在哪里。但它实际上并没有在屏幕上正确呈现页面,就好像 message 未定义一样。

如果我直接用index_page (message = "You have successfully logged out") 定义message,它会正确呈现。

编辑: 谢谢,我试过这样做。但是,问题是在渲染之前一切正常。考虑一下我所做的这段代码:

@app.route('/', methods=['POST','GET'])
    def index_page():    
        try:
            print("Checkpoint 1")
            message = request.args['message']
            print("Checkpoint 2")
    except:
        print("Checkpoint 3")
        message = "Other message"

    print("Checkpoint 4",message)
    #print("Checkpoint 5",render_template('index.html',message=message))
    return render_template('index.html',message=message)                 

所以,当我只是刷新页面(不传递任何消息)时,我的控制台输出类似于:

Checkpoint 1
Checkpoint 3
Checkpoint 4 "Other message"
"GET / HTTP/1.1" 200 -

我看到页面显示“其他消息” 但是,如果我先通过调用logout 传递消息,我会得到如下信息:

Checkpoint 1
Checkpoint 2
Checkpoint 4 "You have successfully logged out"
"GET /?message=You+have+successfully+logged+out HTTP/1.1" 200 -

我仍然看到显示“其他消息”的页面。

如果我打印出检查点 5,它会在两种情况下都提供正确的 HTML 和正确的消息。

请注意,在第一种情况下,我没有收到 GET /?message=something 形式的 GET 请求,也许这就是问题所在?

【问题讨论】:

  • 为什么不直接使用 flash()?

标签: python flask jinja2


【解决方案1】:

一般来说:永远不要使用try/except 捕获所有异常。

你会错过重要的错误,就像在这种情况下一样。管理员无法安全地升级程序。

在这种情况下,您有一个 session['logged_in'] 而不设置值(在 index_page 中)。我认为这会导致异常(会话中未定义的项目),所以它永远不会写message

【讨论】:

  • 感谢您的回答,但我认为情况并非如此。我从logout 重定向到index_page,在那里我定义了session['logged_in']。另外,如果我在index page 中打印出messagerender_template('index.html',message=message),我会得到预期的输出。然而,当我 返回 相同的 render_template 时,我得到的 html 呈现不正确。
  • 删除尝试/异常。我想你会有更好的错误信息。我也不确定您是否可以在函数中使用没有消息签名的 url_for(..., message) 。但就我个人而言,我会避免在同一条路线中混合 GET 和 POST(尤其是在这里,我认为您不需要 POST(也注销,顺便说一句))
  • 谢谢,我试过了。但是,问题是在渲染之前一切正常。考虑我所做的这段代码(发布在原始帖子中)
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2012-09-30
  • 2012-11-28
  • 1970-01-01
相关资源
最近更新 更多