5_自定义url路由转换器

Posted nichengshishaonian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5_自定义url路由转换器相关的知识,希望对你有一定的参考价值。

自定义URL转换器

自定义URL转换器的方式:

  1. 必须实现一个类,继承自BaseConverter(werkzeug.routing.BaseConverter)。
  2. 在自定义的类中,重写regex,也就是这个变量的正则表达式。
  3. 将自定义的类,添加到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路由转换器的主要内容,如果未能解决你的问题,请参考以下文章

flask第十一篇——自定义url转换器

flask第十一篇——自定义url转换器

Flask自定义正则路由方法

网站后端_Python+Flask.0006.FLASK地址转换之默认转换与自定义转换?

flask第二十一篇——练习题

如何使用自定义路由模式访问 url?