Flask: index()返回render_template(…).为什么return index()不工作?<



使用Flask。这一定是一个我不知道的基本问题。

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

index()根据会话参数将url设置为这两个字符串中的一个,并返回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(因为没有session中的MODE,触发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
    

    返回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)

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

最新更新