11.路由转换器的进阶使用

普通表达式

实现手机号匹配


class MobileConvert(BaseConverter):
    def __init__(self,url_map):
        super(MobileConvert,self).__init__(url_map)
        self.regex = r'1[34578]\d{9}'
        
app.url_map.converters["mobile"] = MobileConvert

@app.route("/send/<mobile:mobil_num>")
def send_sums(mobil_num):
    return  "send sms to %s" %mobil_num

当检测到了路径之后,按照类型,在converters找mobile,再找到了MobileConvert类,将此类构造对象。知道了regex,根据regex的正则表达式根据路径去提取参数,根据正则表达式去提取参数
在这里插入图片描述

to_path使用

#coding:utf-8
#file: converter_demo2.py
#@author: young
#@contact: [email protected]
#@time: 2019/12/8 16:23

from flask import  Flask, current_app
from flask import  redirect,url_for
from werkzeug.routing import  BaseConverter

# 创建flask的应用对象
# __name__   表示当前模块的名字
#模块名:flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
app = Flask(__name__)

#1、定义自己的转换器
class RegexConverter(BaseConverter):
    def __init__(self,url_map,regex):
        #将自己的正则表达式的参数保存到对象属性中,flask会去使用属性来进行路由的正则匹配
        #调用父类构造初始化方法
        super(RegexConverter,self).__init__(url_map)
        self.regex = regex
        #有一个固定的属性,从BaseConverter中拿到的
        #存放匹配正则表达式什么样子
        #url_map:构造转换器对象的时候将app.url_map.converters传回的路由映射列表当做整体传到第一个参数
        #正则表达式作为第一个参数传进去
    def to_python(self, value):
        #可以做一些操作处理
        print("to_python方法调用")
        return "abc"
        
    def to_url(self, value):
        pass
#2.将自定义的转换器添加到flask的应用中  re:起的名字,将类添加到app.url_map.converters中,以键值对保存
app.url_map.converters["re"] = RegexConverter

#127.0.0.5000/send/15614191816
#路径中手机号和路由匹配上,先交给to_python的参数value,

@app.route("/send/<re(r'1[34578]\d{9}'):mobile_num>")
def send_sms(mobile_num):
	#to_python的返回值是参数mobile_num
    return "send sms to %s" % mobile_num
    
if __name__ == '__main__':
    #通过url_map可以查看整个flask中的路由信息
    print(app.url_map)
    #启动flask程序
    app.run(debug=True)

在这里插入图片描述在这里插入图片描述

to_url使用

输入127.0.0.1:5000/index跳转到http://127.0.0.1:5000/send/15614191816或者默认的http://127.0.0.1:5000/send/15611111111

#coding:utf-8
#file: converter_demo2.py
#@author: young
#@contact: [email protected]
#@time: 2019/12/8 16:23

from flask import  Flask, current_app
from flask import  redirect,url_for
from werkzeug.routing import  BaseConverter
# import  demo
# 创建flask的应用对象
# __name__   表示当前模块的名字
#模块名:flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
app = Flask(__name__)

#eg:127.0.0.1:5000/goods/123
#从列表里从到右去找,看见int,匹配int类型的值
#:进行分割,
#<>提取方式
# @app.route("/goods/<int:goods_id>")
# @app.route("/goods/<goods_id>")
#不加转换器类型,默认是普通字符串规则(除了/的字符)
# def goods_detail(goods_id):
#     return "good detail page %s"   %  goods_id
#1、定义自己的转换器
#类的方式定义:eg:定义接受正则表达式的转换器
class MobileConvert(BaseConverter):
    def __init__(self,url_map):
        super(MobileConvert,self).__init__(url_map)
        self.regex = r'1[34578]\d{9}'
class RegexConverter(BaseConverter):
    def __init__(self,url_map,regex):
        #将自己的正则表达式的参数保存到对象属性中,flask会去使用属性来进行路由的正则匹配
        #调用父类构造初始化方法
        super(RegexConverter,self).__init__(url_map)
        self.regex = regex
        #有一个固定的属性,从BaseConverter中拿到的
        #存放匹配正则表达式什么样子
        #url_map:构造转换器对象的时候将app.url_map.converters传回的路由映射列表当做整体传到第一个参数
        #正则表达式作为第一个参数传进去
    def to_python(self, value):
        #路径转换到python程序中来
        #可以做一些操作
        print("to_python方法调用")
        # return "abc"
        return  value
    def to_url(self, value):
        #视图用到python数据转换到url中去
        #使用url_for方法的时候被调用
        print("to_url方法调用")
        return "15614191816"
        #返回给路径/send/后

#2.将自定义的转换器添加到flask的应用中  re:起的名字,将类添加到
app.url_map.converters["re"] = RegexConverter

# app.route("/send/<mobile:mobile_num>")
@app.route("/send/<re(r'1[34578]\d{9}'):mobile_num>")
def send_sms(mobile_num):
    return "send sms to %s" % mobile_num

@app.route("/index")
def index():
    url = url_for("send_sms",mobile_num="15611111111")#先给to_url中
    #/send/15614191816
    return redirect(url)#重定向跳转,但是send后面有一个值不知道

if __name__ == '__main__':
    #通过url_map可以查看整个flask中的路由信息
    print(app.url_map)
    #启动flask程序
    app.run(debug=True)

在这里插入图片描述在这里插入图片描述可以修改to_url的value值
下面是返回的默认值:

    def to_url(self, value):
        #视图用到python数据转换到url中去
        #使用url_for方法的时候被调用
        print("to_url方法调用")
        return value
        #返回给路径/send/后

在这里插入图片描述

发布了60 篇原创文章 · 获赞 8 · 访问量 3333

猜你喜欢

转载自blog.csdn.net/qq_43476433/article/details/103445889
今日推荐