烧瓶: index() returns render_template(...) 。为什么 return index() 不起作用?

Flask: index() returns render_template(...) . Why does return index() not work?

使用 Flask。这一定是我不知道的基本陷阱。

我有两个模板,index.htmlindex8.html

index() 根据会话参数将 url 设置为这两个字符串之一,并且 returns render_template(url, data={...})

然后我有一个 toggleMode() 设置会话参数(来自 POST),然后调用 return index()

似乎 运行 index() 代码...它正确打印出 index.htmlindex8.html,它被传递给 render_template,然后返回,然后返回...但它从不使用 index8.html

如果您更改 html 模板文件,是否需要重定向?是吗?

在这种情况下,为什么 Flask 不更改模板?我正在打印模板名称,它是 'index8.html' 传递给 render_template。但它仍然呈现为好像我已通过 'index.html'。 (或者,更确切地说,它根本不做新的渲染,尽管 Flask 返回 200 回复 toggleMode()

编辑:

好的最小示例...

@app.route('/')
def index():
   
    try:
        mode = session['MODE'] == "Four"
    except:
        session['MODE'] = "Four"
        mode = True

    
    print ('index.html' if mode else 'index8.html')

    url4 = 'index.html'
    url8 = 'index8.html'

    return render_template(url4 if mode else url8, data={...})

@app.route('/toggleMode', methods=['POST'])
def toggle_mode():
    data = request.get_json()
    print (data)
    session['MODE'] = data[0]['mode']
    print(session['MODE'])
    return index()

我得到了正确的 index.htmlindex8.html 打印出来,但切换模式总是呈现 index.html

您的示例代码似乎按设计工作。如果我用一些额外的代码包装它以使其可运行(如果您在发布问题时这样做会有所帮助),那么我们有:

from flask import Flask, request, render_template

app = Flask(__name__)

# I'm faking a session with a global variable here.
session = {}


@app.route("/")
def index():
    try:
        mode = session["MODE"] == "Four"
    except:
        session["MODE"] = "Four"
        mode = True

    url4 = "index.html"
    url8 = "index8.html"

    if mode:
        return f"mode is True, use {url4}\n"
    else:
        return f"mode is False, use {url8}\n"


@app.route("/toggleMode", methods=["POST"])
def toggle_mode():
    data = request.get_json()
    session["MODE"] = data[0]["mode"]
    return index()

我看到以下行为:

  1. / 的初始请求使用 index.html(因为没有 MODE in session,触发 KeyError 所以我们点击 except块)。

    $ curl localhost:5000
    mode is True, use index.html
    
  2. 我们向 /toggleMode 发出请求,mode 设置为任何值 除了`四:

    $ curl -H content-type:application/json -d '[{"mode": "Three"}]' localhost:5000/toggleMode
    mode is False, use index8.html
    

    这个 returns 到 index(),它使用 index8.html 因为 条件 session["MODE"] == "Four"False.

  3. /的请求显示会话更改是持久的;这 条件仍然是 False:

    $ curl localhost:5000
    mode is False, use index8.html
    
  4. 我们向 /toggleMode 发出请求,其中 mode 设置为 Four:

    $ curl -H content-type:application/json -d '[{"mode": "Four"}]' localhost:5000/toggleMode
    mode is True, use index.html
    

    通过此更改,index() 再次使用 index.html

  5. ...并且更改是持久的:

    $ curl localhost:5000
    mode is True, use index.html
    

如果我替换这个:

    if mode:
        return f"mode is True, use {url4}\n"
    else:
        return f"mode is False, use {url8}\n"

有了这个:

return render_template(url4 if mode else url8)

我继续看到正确的行为:如果我创建与两个模板名称匹配的文件,它们将被正确使用。