烧瓶: index() returns render_template(...) 。为什么 return index() 不起作用?
Flask: index() returns render_template(...) . Why does return index() not work?
使用 Flask。这一定是我不知道的基本陷阱。
我有两个模板,index.html
和 index8.html
index()
根据会话参数将 url
设置为这两个字符串之一,并且 returns 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
(因为没有
MODE
in session
,触发 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
这个 returns 到 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)
我继续看到正确的行为:如果我创建与两个模板名称匹配的文件,它们将被正确使用。
使用 Flask。这一定是我不知道的基本陷阱。
我有两个模板,index.html
和 index8.html
index()
根据会话参数将 url
设置为这两个字符串之一,并且 returns 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
(因为没有MODE
insession
,触发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
这个 returns 到
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)
我继续看到正确的行为:如果我创建与两个模板名称匹配的文件,它们将被正确使用。