接上回flask的路由转换器的写法,这回讲述flask的自定义路由转换器以及进阶使用方法。
自定义路由转换器写法比较简单,将参数regex进行赋值,直接把方法写入,如日期的定义方法d{4}_d{2}_{2},可将参数定义为regex=d{4}_d{2}_d{2},例如下:
# current_app为app的全局代理人,功能上相当于app
# redirect跳转界面,可以指定跳转到哪个界面
# url_for通过视图函数名字找到对应视图的url路径
from flask import Flask,current_app,redirect,url_for
from werkzeug.routing import baseConverter
# 创建flask的应用对象
# __name__表示当前的模块名字
# 模块名,flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
app = Flask(__name__)
# 转换器类型有int,float,path
@app.route("/goods/") # 不加转换器类型,默认为普通字符串规则 (出了"/"的字符串)
def goods_detail(goods_id):
"""定义的视图函数"""
return "goods detail page %s"%goods_id
# 普通转化器的创建方法
# 1.定义自己的转换器
class MobileConverter(baseConverter):
def __init__(self,url_map): # url_map是固定的参数,将整个列表进行带入
# 调用父类的初始化方法
super().__init__(url_map)
self.regex = r'd{4}_d{2}_d{2}'
# self.regex = r'd{4}w{1}d{2}w{1}d{2}' #也可
# 将自定义的转换器添加到flask的应用中
app.url_map.converters["mobile"] = MobileConverter
@app.route("/send/")
def send_ms(mobile_num):
return "hello world %s"%mobile_num
if __name__ == '__main__':
# 通过url_map可以查看整个flask的路由信息
print(app.url_map)
# 启动flask的程序
app.run(debug= True)
调用方法为:http://127.0.0.1:5000/send/2021_06_01
此外输出的参数并不是直接到正则匹配进行输出的,中间有**to_python()**函数进行中转,过程为:获取输入的参数——>to_python()函数处理后的结果进行中转——>接收结果后返回对应的视图函数,范例如下:
# current_app为app的全局代理人,功能上相当于app
# redirect跳转界面,可以指定跳转到哪个界面
# url_for通过视图函数名字找到对应视图的url路径
from flask import Flask,current_app,redirect,url_for
from werkzeug.routing import baseConverter
# 创建flask的应用对象
# __name__表示当前的模块名字
# 模块名,flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
app = Flask(__name__)
# 转换器类型有int,float,path
@app.route("/goods/") # 不加转换器类型,默认为普通字符串规则 (出了"/"的字符串)
def goods_detail(goods_id):
"""定义的视图函数"""
return "goods detail page %s"%goods_id
# 普通转化器的创建方法
# 1.定义自己的转换器
class MobileConverter(baseConverter):
def __init__(self,url_map): # url_map是固定的参数,将整个列表进行带入
# 调用父类的初始化方法
super().__init__(url_map)
self.regex = r'd{4}_d{2}_d{2}'
# self.regex = r'd{4}w{1}d{2}w{1}d{2}' #也可
def to_python(self,value):
"""对mobile_num进行操作后再返回send_ms函数中(对应函数)"""
print("to_python被调用")
result = "ok__" + value 此处可继续参数的编辑
return result
# 将自定义的转换器添加到flask的应用中
app.url_map.converters["mobile"] = MobileConverter
@app.route("/send/")
def send_ms(mobile_num):
return "hello world %s"%mobile_num
if __name__ == '__main__':
# 通过url_map可以查看整个flask的路由信息
print(app.url_map)
# 启动flask的程序
app.run(debug= True)
调用方法为:http://127.0.0.1:5000/send/2021_06_01
同to_python() 函数相似的to_url() 函数功能上一致,但to_url() 函数是在使用url_for() 方法时使用的,使用方法如下:
# current_app为app的全局代理人,功能上相当于app
# redirect跳转界面,可以指定跳转到哪个界面
# url_for通过视图函数名字找到对应视图的url路径
from flask import Flask, current_app, redirect, url_for
from werkzeug.routing import baseConverter
# 创建flask的应用对象
# __name__表示当前的模块名字
# 模块名,flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
app = Flask(__name__)
# 转换器类型有int,float,path
@app.route("/goods/") # 不加转换器类型,默认为普通字符串规则 (出了"/"的字符串)
def goods_detail(goods_id):
"""定义的视图函数"""
return "goods detail page %s" % goods_id
# 普通转化器的创建方法
# 1.定义自己的转换器
class MobileConverter(baseConverter):
def __init__(self, url_map): # url_map是固定的参数,将整个列表进行带入
# 调用父类的初始化方法
super().__init__(url_map)
self.regex = r'd{4}_d{2}_d{2}'
# self.regex = r'd{4}w{1}d{2}w{1}d{2}' #也可
def to_python(self,value):
"""对mobile_num进行操作后再返回send_ms函数中(对应函数)"""
print("to_python被调用")
result = "ok__" + value
return result
def to_url(self, value):
"""对mobile_num进行操作后再返回send_ms函数中(对应函数)"""
# 使用url_for方法时to_url被调用
value = r"2021_10_30"
# return value代表使用mobile_num默认值,return xxx代表使用修改的传递值
return value
app.url_map.converters["mobile"] = MobileConverter
@app.route("/send/")
def send_ms(mobile_num):
return "hello world %s"%mobile_num
@app.route("/index")
def index():
# mobile_num为传递的默认值,to_url为实际的返回值
# 使用url_for方法调用to_url函数
url = url_for("send_ms", mobile_num="1585")
return redirect(url)
if __name__ == '__main__':
# 通过url_map可以查看整个flask的路由信息
print(app.url_map)
# 启动flask的程序
app.run(debug=True)
调用方法为:http://127.0.0.1:5000/index
上述的代码会比较难懂,过程梳理一下:首先调用http://127.0.0.1:5000/index 启动index视图——>url_for() 函数将定向到send_ms视图并携带参数mobile_num=“1585”——>携带的参数会经过to_url() 函数进行处理并返回send_ms视图——>send_ms视图接收的参数返回to_python() 函数进行处理并返回结果——>send_ms视图收到最终结果在进行显示。
最后的过程会比较麻烦,全流程都调用起来就复杂一些,Flask框架的路由转换器就讲到这里了。



