Flask自定义转换器

Flask框架中自带的转换器:

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

Flask框架中的转换器的自定义,具体流程如下:

  1. 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录;
  2. 自定义转换器:自定义类继承于转换器基类;
  3. 添加转换器到默认的转换器字典中;
  4. 使用自定义转换器实现自定义匹配规则。

下面以正则匹配作为案例进行分析:

①导入转换器基类:

from werkzeug.routing import BaseConverter

基类的部分源代码:

class BaseConverter(object):
    """Base class for all converters."""
    regex = '[^/]+'
    weight = 100

    def __init__(self, map):
        self.map = map

②自定义转换器

方法一:直接修改基类的regex属性值)

class RegexConverter(BaseConverter):
#     regex = '(\\d+,?)+\\d$'  # 修改父类的的regex属性

(方法二:重写父类的__init__方法,更改实例属性self.regex的值)

class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        self.regex = args[0]  # 重写父类的实例属性值

③添加转换器到默认的转换器字典中:

app.url_map.converters['re'] = RegexConverter

这句代码实现的效果如下:

   DEFAULT_CONVERTERS = {
        'default':          UnicodeConverter,
        'string':           UnicodeConverter,
        'any':              AnyConverter,
        'path':             PathConverter,
        'int':              IntegerConverter,
        'float':            FloatConverter,
        'uuid':             UUIDConverter,
        're':                RegexConverter   #  增加的自定义转换器
    }

④使用自定义转换器实现自定义匹配规则:

方法一实现方式:

# <> 里面是给路由添加的参数;需要使用的正则在re里面写好了
 @app.route('/demo/<re:use_ids>')   # 
 def demo6(use_ids):
     return '数据是%s' % use_ids

方法二实现方式

# 想要进行的匹配方式,写在re后面,re(''正则表达式'')
@app.route('/demo/<re("[0-9]{6}"):use_ids>')  
def demo7(use_ids):
    return '数据是%s' % use_ids

方法一完整代码:

from werkzeug.routing import BaseConverter

 class RegexConverter(BaseConverter):
     regex = '(\\d+,?)+\\d$'
     
 app.url_map.converters['re'] = RegexConverter
     
 @app.route('/demo/<re:use_ids>')
 def demo6(use_ids):
     return '数据是%s' % use_ids

方法二完整代码:

from werkzeug.routing import BaseConverter

class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        self.regex = args[0]
     
 app.url_map.converters['re'] = RegexConverter

@app.route('/demo/<re("[0-9]{6}"):use_ids>')
def demo7(use_ids):
    return '数据是%s' % use_ids
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值