Flask框架中自带的转换器:
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
Flask框架中的转换器的自定义,具体流程如下:
- 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录;
- 自定义转换器:自定义类继承于转换器基类;
- 添加转换器到默认的转换器字典中;
- 使用自定义转换器实现自定义匹配规则。
下面以正则匹配作为案例进行分析:
①导入转换器基类:
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