flask路由
flask路由
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
函数传入的动态路由部分从列表转换成拼接字符串了