前言
前几章下来,我们可以让一个视图函数返回一个指定的网页(页面模板),同时这个模板里面可以添加一些指定的静态资源。接下来我们说说:
- 视图函数的参数
- 视图函数往页面模板内传入变量
- 反转函数
url_for()
1.视图函数传入参数
之前几节我们已经接触过视图函数,其本质就是某个页面的后端逻辑,利用
app.route()
可以很方便的与页面关联,想想这样一个页面,我们/blog/easy_flaks/6.html,表示这是我们flask博客的第6节,我们怎么写视图函数和路由方法呢?
@app.route('/easy_flask/6/')
def blog():
return "Hello, easy_flask 6!"
可是我还有很多小节要写,不能每次都写一个视图函数并且添加个路由装饰器。
如果是这样:
@app.route('/easy_flask/<int:section_id>/')
def blog(section_id):
return "Hello, easy_flask {0}!".format(section_id)
- 无论这多少小节,我们可以利用这个参数来处理了
2.视图函数往模板里传入变量
接着上一小节,这个
section_id
如果是需要在html中显示的,则需要视图函数把参数传进去:
blog.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>blog</title>
</head>
<body>
这一章的章节号为:
{{section_id}}}
作者是:
{{auth}}
</body>
</html>
改一改视图函数:
@app.route('/easy_flask/<int:section_id>/')
def blog(section_id):
return render_template("easy_flask.html", section_id=section_id, auth="Mr.sun")
我们似乎凭空创建了个参数
auth
,是的,并不一定是需要视图函数本身的参数,我们也可以作为视图函数自定义的往页面模板中传入想要传入的变量,这是不是很简单呢~
3.反转函数
url_for()
上一章,我们说过这个函数可以寻找静态资源,但他有另一个重要的作用,反转函数:
url_for()
函数用于构建指定函数的 URL。它把函数名称作为第一个 参数。它可以接受任意个关键字参数,每个关键字参数对应 URL 中的变量。未知变量 将添加到 URL 中作为查询参数。
为什么不在把 URL 写死在模板中,而要使用反转函数 url_for() 动态构建?
- 反转通常比硬编码 URL 的描述性更好。
- 你可以只在一个地方改变 URL ,而不用到处乱找。
- URL 创建会为你处理特殊字符的转义和 Unicode 数据,比较直观。
- 生产的路径总是绝对路径,可以避免相对路径产生副作用。
- 如果你的应用是放在 URL 根路径之外的地方(如在 /myapplication 中,不在 / 中), url_for() 会为你妥善处理。
简而言之,就是让我们可以通过函数名字找到对应的函数,这样很方便,例如:
-
在页面模板中的某一个按钮可以调用一个逻辑函数
-
在页面模板中某一个链接可以调用另一个视图函数
-
在页面模板中满足什么条件自动调用某一个函数
-
一个视图函数处理完跳转到另一个视图函数
-
表单提交后转到表单处理函数
-
等等。。。
举个栗子:
@app.route('/login/')
def login():
if form.validate_on_submit():
user= form.user.data
db.session.commit() # 数据库提交
return redirect(url_for('.main_index'))
# return redirect(url_for('.main_index'),param=**,var=**)
return render_template("base.html")
@app.route('/index/')
def main_index():
return render_template("index.html")
当提交完用户信息后,跳转到
main_index()
,随后返回了index.html