一般情况下通过一个URL就可以执行到某一个函数。如果反过来,知道一个函数,怎么去获得这个URL呢?url_for函数就可以实现这个功能。url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。
使用url_for的原因有两点:
- 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
- url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮我们搞定。
示例代码1:
from flask import Flask, url_for
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
@app.route('/')
def hello_world():
return url_for('article', id=1)
@app.route('/article/')
def article(id):
return f'id {id} article detail'
if __name__ == '__main__':
app.run()
运行结果:
示例代码2:
from flask import Flask, jsonify, url_for
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
books = [
{"id": 1, "name": '三国演义'},
{"id": 2, "name": '水浒传'},
{"id": 3, "name": '西游记'},
{"id": 4, "name": '红楼梦'},
]
@app.route('/')
def hello_world():
return 'hello world'
@app.route('/books/list')
def book_list():
for book in books:
book['url'] = url_for("book_detail", book_id=book['id'])
# return books # 直接返回books会报错的,类型格式不支持
return jsonify(books)
@app.route('/book/details/')
def book_detail(book_id):
for book in books:
if book_id == book['id']:
return book
return f"id:{book_id}的图书不存在!"
if __name__ == '__main__':
app.run()
运行结果: