美文网首页
Flask自定义转换器要点

Flask自定义转换器要点

作者: Stone0823 | 来源:发表于2020-05-03 17:49 被阅读0次

    本篇通过两个示例,讲解 Flask 自定义转换器的要点:

    1、如果需要校验 URL 中 Path 的规则,在自定义转换器的 __init__() 方法中改写 (override)BaseConverter 的 regex 属性。或者在转换器所在类中直接对 regex 属性赋值,如 IntegerConverter:

    class IntegerConverter(NumberConverter):
        regex = r"\d+"
        num_convert = int
    

    2、如果要对 URL 中的 Path 值传给 view function 时进行改变,改写 (override) 自定义转换器的 to_python() 方法。该方法将 Path 转换为 Python 对象。

    示例一

    实现功能:URL Path 为 user id,在 view functiion 中显示为 user name。用户数据用 dict 表示,不从数据库中读取。

    # ValidUsers.py
    
    from werkzeug.routing import BaseConverter, ValidationError
    
    _users = [
        {'id': '1', 'username': 'Admin'},
        {'id': '2', 'username': 'Stone'}
    ]
    
    def find_user(userid):
        for user in _users:
            if userid == user['id']:
                return user
    
    class ValidUserConverter(BaseConverter):    
        def to_python(self, value):
            if not find_user(value) is None:
                return find_user(value)['username']
            raise ValidationError()
    

    Flask 程序使用 ValidUserConverter:

    # app.py
    
    from flask import Flask, jsonify, url_for
    from ValidUser import ValidUserConverter
    
    app = Flask(__name__)
    app.url_map.converters['validuser'] = ValidUserConverter
    
    @app.route('/')
    def index():
        return 'Home Page'
    
    @app.route('/users/<validuser:userid>')
    def greet_user(userid):
        return jsonify({'Hello': userid})
    
    if __name__ == "__main__":
        app.run()
    

    当客户端请求路径为:

    localhost:5000/users/1
    

    返回的 json 为:

    {
        "Hello": "Admin"
    }
    

    示例二

    示例改写自博文后标注的参考文章,要实现的功能:允许在请求的 URL Path 中使用 + 号,转换器将 + 号连接的 Path 解析为 list,从而增加了查询的灵活性。比如可以同时查询 id 为 1、2、3 的用户信息。

    # ListConverter.py
    
    from werkzeug.routing import BaseConverter
    
    class ListConverter(BaseConverter):
        def to_python(self, value):
            return value.split('+')
    
        def to_url(self, values):
            return '+'.join(str(value) for value in values)
    

    Flask 程序使用 ListConverter:

    # app.py
    
    from flask import Flask, jsonify, url_for
    from ListConverter import ListConverter
    
    app = Flask(__name__)
    app.url_map.converters['list'] = ListConverter
    
    @app.route('/')
    def index():
        print(url_for('greet_user', users=[1, 4, 6]))
        return 'Home Page'
    
    @app.route('/users/<list:users>')
    def greet_user(users):
        names = ','.join(user for user in users)
        return 'Hello: ' + names
    
    if __name__ == "__main__":
        app.run()
    

    当客户端请求的 URL Path 为:

    localhost:5000/users/1+2+5
    

    传给 view function greet_user() 函数的参数被转换为 list(1,2,5),从而方便进行转换。

    示例代码

    github

    参考

    相关文章

      网友评论

          本文标题:Flask自定义转换器要点

          本文链接:https://www.haomeiwen.com/subject/qtcjghtx.html