url 传参的两种方式
动态路由传参
- @App.route('/student_list/<student_id>/')
- def student_list(student_id):
- return f'学生 {student_id} 号的信息'
动态路由的过滤
我们可以对上面的参数 student_id 限定数据类型, 比如限定他为整型
- @App.route('/student_list/<int:student_id>/')
- def article_detail(student_id):
- return f'学生 {student_id} 号的信息'
主要有这几种类型过滤
string: 默认的数据类型, 接受没有任何斜杠 "/" 的字符串
int: 整型
float: 浮点型
path: 和 string 类型相似, 但是接受斜杠, eg: 可以接受参数 / aa/bb/cc 多条放在一起
uuid: 只接受 uuid 格式的字符串
补充
any 可以指定多种路径, url_path 的变量名是自己定义的
- @App.route('/<any(student,class):url_path>/<id>/')
- def item(url_path, id):
- if url_path == 'student':
- return f'学生 {id} 号的信息'
- else:
- return f'班级 {id} 号的信息'
动态路由的适用场景
如果想增加网站的曝光率, 可以考虑使用动态路由, 因为是把 path 作为参数, 搜索引擎的算法会定义你为一个静态页面, 不会经常改变, 有利于搜索引擎的优化.
上面我们接受参数使用的是 path(路径)形式, 这种传参的形态就叫做动态路由传参, 有利于搜索引擎的优化
查询字符串传参
如果我们在浏览器中输入 www.baidu.com/s?wd=python&ad=flask 的参数, 这个? 后的 key=value 便是查询字符串, 可以写多个 key=value 用 & 相连, 将查询字符串作为参数去请求 flask 程序
在用查询字符串传参的时候需要从 flask 模块里面导入 request 对象, 用 request.args 属性在程序中根据查询字符串的 key 取出查询字符串的 value
args 是 request 的一个属性, 本质是一个 Werkzeug 依赖包的 immutableMultiDict 的对象, 用于解析传入查询字符串, immutableMultiDict 也继承了 Dict 类, 所以可以使用字典的. get 方法来获取, 如果我们有获取原生未解析的原生查询字符串的需求, 可以使用 query_string 属性
- @App.route('/student_list/')
- def student_list():
- name = request.args.get("name")
- age = request.args.get("age")
- return f"学生{name}, 年龄{age}"
url_for()的使用
url_for()的原理
利用视图函数名字一般不会改变的特性, 去动态精准的获取 url, 以便于开发使用
- url_for('视图函数名字') #输出该视图函数的 url
- from flask import Flask, url_for
- App = Flask(__name__)
- @App.route('/') # 匹配 url
- def hello_world():
- print(url_for("book"))
- return url_for("book") #注意, 这个引用的是视图函数的名字 字符串格式
- @App.route('/book_list/')
- def book():
- return 'flask_book'
url_for()如何动态的处理函数
如果想获取动态路由, 必须以关键词实参的形式为动态的 path 部分赋值, 注意动态的 path 部分必须被赋值
- @App.route('/') # 匹配 url
- def hello_world():
- book_url = url_for("book", id=5, name="English")
- print(book_url)
- return book_url
- @App.route('/book_list/')
- def book(id):
- return f'book{id}'
浏览器显示:
url_for()如何为 url 添加查询字符串
如果想在路径后面拼出来查询字符串, 以关键词实参的形式放到 url_for()里面作为参数, 会自动拼接成路径
这个你可以看上面一个案例和图片, 我在上面写了 id 和 name 两个关键词参数, 在输出的时候, 他已经给我自动拼接了, 把 name=English 看见了吗, 就是这个意思哈
自定义动态路由过滤器
自定义动态路由过滤器之正则匹配
我们可以通过继承 Werkzeug.routing 的 BaseConverter 类从而自己定义一个动态路由过滤器规则
- from flask import Flask
- from werkzeug.routing import BaseConverter
- App = Flask(__name__)
- App.debug =True
- class Telephone(BaseConverter):
- regex = '1[3587]\d{9}'
- App.url_map.converters['tel'] = Telephone
- @App.route('/student/<tel:telenum>/')
- def student_detail(telenum):
- return f"学生的手机号为{telenum}"
- if __name__ == '__main__':
- App.run()
电话号码不符合正则规则是会报错的
注意
自定义路由过滤器类, 该类必须继承 werkzeug.routing 的 BaseConverter 类
通过 redex 属性指定路由规则
将自定义类映射到
App.url_map.converters
中(其本质是一个字典),
App.url_map.converters['tel'] = Telephone
自定义动态路由过滤器之处理动态路由
自定义一个类, 该类通过继承 Werkzeug.routing 的 BaseConverter 类不光实现正则匹配, 有两个方法:
在该类中实现 to_python 方法:
这个方法的返回值, 将会传递给视图函数的参数, 我们可以利用这个方法实现处理 url 中动态路由部分.
在该类中实现 to_url 方法:
我们传入指定的动态路由部分, 触发 to_url 方法, 这个方法的返回值 , 会拼接在非动态路由上, 从而实现生成符合要求的 url 格式
- from flask import Flask, url_for
- from werkzeug.routing import BaseConverter
- App = Flask(__name__)
- App.debug = True
- class ListConverter(BaseConverter):
- regex = '.*'
- def to_python(self, value):
- '''
- 这个函数用于拿到了路由里的动态参数赋值给 value,
- 可以在 to_python 进行操作动态参数,
- 返回操作完的的结果给视图函数的形参
- ''' return value.split('+')
- def to_url(self, value):
- '''
- 这个函数用于和 url_for 连用,
- url_for 通过指定给动态参数 (以关键字实参的形式) 赋值给 value
- 我们可以根据我们的需求操作 url_for 传进来的参数,
- 然后返回一个理想的动态路由内容拼接在 url 上
- ''' return"+".join(value)
- App.url_map.converters['list'] = ListConverter
- @App.route('/student_list/<list:students>/')
- def student_detail(students):
- print(url_for('student_list', students=['a', 'b'])) #输出 / student_list/a+b/
- return f"学生{students}"
- if __name__ == '__main__':
- App.run()
以上证明 to_python 方法在访问的时候把部分路由处理为了列表
以上证明 to_url 方法将 url_for 函数传入的动态路由部分从列表转换成拼接字符串了
来源: http://www.bubuko.com/infodetail-3438386.html