Flask03 路由控制(转换器)、反转、请求方法控制
1 提出问题
如何实现前端传过去的路径时动态的(即:多个url对应一个url视图函数)
例如:
浏览器中输入 http://127.0.0.1:5000/test/good/ 或者 http://127.0.0.1:5000/test/fury/ 时,在后台执行的都是同一个url视图函数
2 解决问题
利用flask的转换器实现
2.1 什么是转换器
@app.route('/test/<string:let>/', endpoint="test01") 中 <> 的部分就叫做转换器
代码解释:路径的最后一部分可以是任意值,但是这个值得类型必须是string类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "这是主页面, hello" @app.route('/test/<string:let>/', endpoint="test01") def test(let): return "多个url对应一个url视图函数 " + let print(app.url_map) if __name__ == "__main__": app.run(debug=True)
2.2 转换器的种类
default 默认转换器(注意:默认转换器就是字符串转换器)
string 字符串转换器,不能识别 /
path 路径转换器,可以看成是string转换器的加强版,可以识别 /
点睛:我们在访问静态文件时之所以可以通过路径进行访问,是因为静态文件的转换器时path类型
int 整型转换器
float 浮点型转换器
点睛:int转换器只能识别整数,float转换器只能识别浮点型
点睛:在url视图函数中会自动将获取到的数据转换成相应的类型
any 多选一类型转换器
uuid UUID类型转换器
点睛:在url视图函数中获取到的数据时UUID类型
点睛:如何获取uuid
form uuid import uuid4
uuid4()
注意: uuid4() 返回的是一个UUID类型的类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "这是主页面, hello" @app.route('/test/<string:let>/', endpoint="test01") def test(let): return "字符串类型转换器 " + let @app.route('/test/<let>', endpoint='test02') def test(let): return "默认类型转换器 " + let @app.route('/test/<path:let>/', endpoint='test03') def test(let): return "path类型转换器 " + let @app.route('/test/<int:let>/', endpoint='test04') def test(let): return 'int类型转换器 ' + str(let) @app.route('/test/<float:let>/', endpoint='test05') def test(let): return 'float类型转换器 ' + str(let) @app.route('/test/<any(fury,zeus,"123","12.34"):let>/', endpoint='test06') def test(let): return 'any类型转换器 ' + let @app.route('/test/<uuid:let>/', endpoint='test07') def test(let): return 'uuid雷翔转换器 ' + let print(app.url_map) if __name__ == "__main__": app.run(debug=True)
3 提出问题
如何根据端点去寻找路径
4 解决问题
通过反转的方式实现
补充知识点:url和url视图函数是怎么对应的
flask中url跟视图函数并不是直接对应的,而是有一个中间者-endpoint
url -> endpoint -> view_function
根据url找到对应的端点,在根据对应的端点找到url视图函数;素以端点时url和url视图函数之间的桥梁,所以我们可以根据端点找到对应的路径
4.1 如何通过 url_for 方法来获取路径
4.1.1 从flask模块中引入url_for
from flask import url_for
4.1.2 利用 ur_for 获取路径
path = url_for('myTest')
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask from flask import url_for app = Flask(__name__) @app.route('/') def index(): path = url_for('myTest') print(path) return '这里还是主页' @app.route('/test/', endpoint='myTest') def test(): return '这里是测试页面' print(app.url_map) if __name__ == '__main__': app.run()
4.2 url_for 小应用
把通过端点获取到的路径放到一个html中去,这样无论如何修改url路径,只要端点不变那么就不用修改html中的路径
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask from flask import url_for app = Flask(__name__) @app.route('/') def index(): path = url_for('myTest') print(path) html = ''' <a href="%s">点击进入测试页面</a> '''%path return html @app.route('/test/', endpoint='myTest') def test(): return '这里是测试页面' print(app.url_map) if __name__ == '__main__': app.run(debug = True)
4.3 通过蓝图的端点获取蓝图路径
和普通路由的区别:蓝图的端点在前面需要加上蓝图名
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask from flask import url_for from flask import Blueprint app = Flask(__name__) bp = Blueprint('movie', __name__) @bp.route('/action/', endpoint='actionMovie') def action(): return '动作电影专区' app.register_blueprint(bp) @app.route('/') def index(): path = url_for('movie.actionMovie') print(path) html = ''' <a href="%s">点击进入动作电影</a> '''%path return html @app.route('/test/', endpoint='myTest') def test(): return '这里是测试页面' print(app.url_map) if __name__ == '__main__': app.run(debug = True)
4.4 带变量的路径反转
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask from flask import url_for app = Flask(__name__) @app.route('/') def index(): path = url_for("test01", let='fury') return '这是主页 ' + path @app.route('/test/<string:let>/', endpoint="test01") def test(let): return '测试页面 ' + let; print(app.url_map) if __name__ == '__main__': app.run(debug = True)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from flask import Flask from flask import url_for app = Flask(__name__) @app.route('/') def index(): path = url_for("test01", let='fury', name='zeus') return '这是主页 ' + path @app.route('/test/<string:let>/', endpoint="test01") def test(let): return '测试页面 ' + let; print(app.url_map) if __name__ == '__main__': app.run(debug = True)
5 控制请求方式
5.1 请求方式
POST GET HEAD OPTIONS
点睛:有get就默认有head,options永远都有
5.2 如何修改请求方式
注意:默认情况下有三种请求方式
5.3 如何通过python实现请求
利用pip安装requests包
pip install requests
导入相关方法
from requests import get, post, head, options
调用相关方法
resp = get(url)
查看相应头部信息
resp.headers
查看响应实体信息
resp.content.decode('utf-8')