5_自定义url路由转换器
Posted nichengshishaonian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5_自定义url路由转换器相关的知识,希望对你有一定的参考价值。
自定义URL转换器
自定义URL转换器的方式:
- 必须实现一个类,继承自
BaseConverter
(werkzeug.routing.BaseConverter)。 - 在自定义的类中,重写
regex
,也就是这个变量的正则表达式。 - 将自定义的类,添加到
app.url_map.converters
上,如:
# 普通转换器
class MobileConverter(BaseConverter):
regex = r'1[3-9]\d9'
app.url_map.converters['mobile'] = MobileConverter # 添加mobile转换器, 添加了后, 则可以在url中使用 `mobile` 这个转换器了
@app.router('/<mobile:mobile>/')
def my_mobile(mobile):
return '我的手机号码为: '.format(mobile)
# 自定义路由转换器
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
app.config.update(DEBUG=True)
# 1. 定义自己的转换器, 万能正则转换器
class RegexConverter(BaseConverter):
"""正则路由转换器"""
def __init__(self, map, regex):
super().__init__(map)
# 将正则表达式的参数保存到对象的属性中, flask会去使用这个属性来进行路由的匹配
self.regex = regex
# 2. 将自定义的转换器添加到Flask的应用中
app.url_map.converters['re'] = RegexConverter
@app.route('/send/<re(r"1[3-9]\d9"):mobile>/') # 使用
def send_sms(mobile):
return 'send sms to '.format(mobile)
# --------------------------
class MobileConverter(BaseConverter):
"""普通转换器, 专用于校验手机号码"""
def __init__(self, map):
super().__init__(map) # 父类调用不调用,对这个我感觉没有影响
self.regex = r'1[3-9]\d9'
app.url_map.converters['mobile'] = MobileConverter
@app.route('/<mobile:mobile>/')
def mobile(mobile):
return 'moible: '.format(mobile)
if __name__ == "__main__":
app.run(port=8000)
to_python
的作用:
在转换器类中,实现to_python(self, value)
方法,这个方法的返回值,将会传递到view视图函数中作为参数.
class ListConverter(BaseConverter):
def to_python(self, value):
# return value.split('+')
return 'hello'
app.url_map.converters['list'] = ListConverter
@app.route('/posts/<list:boards>/')
def boards(boards):
return '您提交的模块是: '.format(boards)
# 访问:http://127.0.0.1:8000/posts/a+b/
# 返回结果为: 您提交的模块是: hello # 第二个 return 'hello'
### 返回结果为: 您提交的模块是: ['a', 'b'] # 第一个return value.split('+')
to_url
的作用:
在转换器类中,实现to_url(self, value)
方法,这个方法的返回值,将会在调用url_for
函数的时候生成符合要求的URL
形式.
以上是关于5_自定义url路由转换器的主要内容,如果未能解决你的问题,请参考以下文章