Flask基础(07)-->正则自定义转换器

 

正则自定义转换器

为什么要自定义正则转换器?

因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了。

那么我们怎么自定义正则转换器呢?

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)


class Config(object):
    DEBUG = True


app.config.from_object(Config)


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

"""
1.re()相当于RegexCoverter(),那么re("[0-9]{6}")相当于给RegexCoverter的__init__传递了参数“[0-9]{6}”
2.url_map是什么我们暂时不管,直接传递给BaseConverter的__init__
3.那么args[0]接收的就是我们定义的正则表达式
4.self.regex其实就是对BaseConverter中regex的重写
5.BaseConverter的这个原生regex:regex = '[^/]+'
"""
@app.route('/user/<re("[0-9]{6}"):user_id>')
def demo1(user_id):
    return "用户的id是:%s"%user_id


@app.route('/')
def hello_world():
    return 'Hello World!!!'


if __name__ == '__main__':
    app.run()

 

转换器to_python

# 转换器to_python
from flask import Flask
from werkzeug.routing import BaseConverter
from flask import  redirect

# 创建Flask的应用程序
app = Flask(__name__)

class ListConverter(BaseConverter):
    regex = "(\\d+,?)+\\d$"
    def to_python(self,value):
        return  value.split(",")

app.url_map.converters['list'] = ListConverter

@app.route('/test1/<list:user_ids>')
def demo1(user_ids):
    return 'user_id是:%s' % user_ids

if __name__ == '__main__':
    # app 运行的参数 ip地址,端口,是否开启调试
    app.run(debug=True)

"""
to_python转换器的程序运行:
1.浏览器向服务器发起访问:http://127.0.0.1:5000/test1/1,2,3
2.<list:user_ids>将'1,2,3'动态传到ListConverter对象内部进行regex正则匹配
3.匹配成功之后,再由to_python以','为分隔符,划分字符串,最后返回浏览器一个列表

"""

附上一张分析图供大家学习:

转换器to_python

# 导入Flask
from flask import Flask
from werkzeug.routing import BaseConverter
from flask import  redirect,url_for

# 创建Flask的应用程序
app = Flask(__name__)


class ListConverter(BaseConverter):
    regex = "(\\d+,?)+\\d$"

    def to_python(self, value):
        return value.split(",")  # 返回一个列表

    def to_url(self, value):
        result = ",".join(str(v) for v in value)
        return result  # 返回一个字符串


app.url_map.converters['list'] = ListConverter


@app.route('/test1/<list:user_ids>')
def demo1(user_ids):
    return 'user_id是:%s' % user_ids

@app.route('/demo2')
def demo2():
    return redirect(url_for("demo1",user_ids=[1,2,3,4]))

if __name__ == '__main__':
    # app 运行的参数 ip地址,端口,是否开启调试
    app.run(debug=True)

"""
to_url自定义转换器程序运行:
1.浏览器向服务器发起访问:http://127.0.0.1:5000/demo2
2.<list:user_ids>将[1,2,3,4]动态传到to_url函数先将[1,2,3,4]进行字符串化,然后进行regex正则匹配
3.匹配成功之后,重定向到http://127.0.0.1:5000/test1/1,2,3,4,并且将users_ids=[1,2,3,4]传给demo1(user_ids),所以
浏览器将输出user_ids的值是:[1,2,3,4]
"""

附上一张to_url分析图供大家理解学习:

 

看到这里也许大家很头疼,to_python和to_url到底是什么鬼,到底怎么记忆他们的用处和执行顺序。其实理解了也很简单:

可以这样的简化记忆

to_python:正则匹配,to_python函数处理,返回给视图函数

to_url:to_url函数处理,正则匹配,返回给重定向目标视图函数

那么可能你又要问了,为什么要这样搞,有什么用处?

呵呵,很简单,因为我们在项目中拿到的数据不一定都是我们正好需求的,当我们拿到一个列表,而我们又正好需要用这个列表中进行页面跳转,

那么这时候就可以用to_url来处理;to_python也是一样的道理,都是进行数据的处理,从而达到我们需求。

(还有不明白的可以下方留言,大家一起探讨↓↓↓↓↓↓)

 

posted @ 2018-08-14 13:39  OldELeven  阅读(202)  评论(0编辑  收藏  举报