使用Flask。这一定是一个我不知道的基本问题。
我有两个模板,index.html
和index8.html
index()
根据会话参数将url
设置为这两个字符串中的一个,并返回render_template(url, data={...})
然后我有一个toggleMode()
设置会话参数(从POST),然后调用return index()
似乎运行index()
代码…它打印出index.html
或index8.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.html
或index8.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()
我看到了以下行为:
对
/
的初始请求使用index.html
(因为没有session
中的MODE
,触发KeyError
,所以我们点击except
块).$ curl localhost:5000 mode is True, use index.html
我们向
:/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
.请求
/
显示会话更改是持久的;的条件仍然是False
:$ curl localhost:5000 mode is False, use index8.html
我们向
/toggleMode
发出请求,mode
设置为Four
:$ curl -H content-type:application/json -d '[{"mode": "Four"}]' localhost:5000/toggleMode mode is True, use index.html
修改后,
index()
再次使用index.html
。…并且更改是持久的:
$ 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)
我继续看到正确的行为:如果我创建的文件匹配两个模板名称,它们被正确地使用。