任何具有多个路由的程序都需要可以连接不同页面的链接,例如导航条。
在模板中直接编写简单路由的URL链接不难,但对于包含可变部分的动态路由,在模板中构建正确的URL就很困难。而且,直接编写URL会对代码中定义的路由产生不必要的依赖关系。如果重新定义路由,模板中的链接可能会失效。
为了解决这个问题,我们在模板中使用 url_for() 函数,利用以视图函数名生成URL
① 以参数为视图函数名
url_for('index')
返回相对地址,即 ‘/’
若加一个参数
url_for('index', _external=True)
则返回绝对地址,即 ‘http://localhost:5000/’
生成连接程序内不同路由的链接时,使用相对地址就足够了。如果要生成在浏览器之外使用的链接,则必须使用绝对地址,例如在电子邮件中发送的链接。
② 使用url_for()时,将动态部分作为关键字参数传入,以生成动态地址,如:
url_for('user', name='john', _external=True)
返回:http://localhost:5000/user/john
③ 传入url_for()的关键字参数不仅限于动态路由中的参数。函数能将任何额 外参数添加到查询字符串中,如:
url_for('index', page=2)
返回: /?page=2
④ 下面贴一个动态传参的例子
# main.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
user_id = 123
return render_template('index.html',user_id=user_id)
@app.route('/user/' )
def user_id(id):
return render_template('user_id.html',id=user_id)
app.run()
<h1>Hello World!h1>
<li><a href="{{ url_for('user_id',id=user_id ) }}">个人信息a>
注意此处的写法!
我在 main.py 中用 render_template 向 index.html 传参渲染,在index.html 中又用 url_for 来生成动态链接.
index.html中的渲染区域(即花括号括的区域),包含 url_for函数 与参数 user_id,且花括号不可嵌套.
如以下两种写法错误!
<li><a href="{{ url_for('user_id',id={{ user_id }}) }}">个人信息a>
<li><a href=" url_for('user_id',{{ id=user_id }} ) ">个人信息a>
有时我们还会使用静态文件,如在HTML中引用的图片、JavaScript和CSS。
此时,我们仍使用url_for生成URL
如在HTML中:
<link rel="stylesheet" href="{{url_for('static',filename='css/index.css') }}">
用于加载static/css目录下的index.css文件
默认设置下,Flask在程序根目录中名为 static 的子目录中寻找静态文件