栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

flask自定义路由转换器与进阶使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

flask自定义路由转换器与进阶使用

接上回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框架的路由转换器就讲到这里了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357140.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号