当我遇到这段代码时,我正在阅读Flask的render_template():
@app.route('/result',methods = ['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html",result = result)
为什么在将输入传递给render_template()时我们必须写result = result?你可以把
看起来更麻烦return render_template("result.html", result)
Flask是否有理由提出这样的方法?
答案 0 :(得分:2)
这背后的原因是你的模板文件可以有很多占位符,它需要知道如何区分它们。
例如,您可以使用以下模板:
<!DOCTYPE html>
<html lang="en">
<head>
<title> {{ page_title }}
</head>
<body>
{{ page_body }}
</body>
</html>
现在认为你不会有变量的名称,需要渲染页面并注入变量而不是占位符的函数如何知道放置每个变量的位置?这就是为什么你实际上以key=value
的形式传递一个字典,你可以将多个键和值传递给函数,而不受函数所知的参数数量的限制。
在上面的示例中,对render_template
函数的调用将是:
render_template('page.html', page_title='this is my title', page_body='this is my body')
这是函数的实际签名(取自here):
def render_template(template_name_or_list, **context):
"""Renders a template from the template folder with the given
context.
:param template_name_or_list: the name of the template to be
rendered, or an iterable with template names
the first one existing will be rendered
:param context: the variables that should be available in the
context of the template.
"""
**context
是Python聚合传递给函数的所有key=value
参数并以下列形式将它们作为字典的方式:
{'key1': value1, 'key2': value2, ...}
我猜测函数本身或被调用的子函数是解释模板页面,并查找模板中提供的变量名称,其中包含字典中与变量名称对应的键的值。
长话短说,这种方式功能足够通用,每个人都可以传递尽可能多的参数,并且函数能够正确呈现模板页面。