美文网首页
Flask路由转换器进阶使用

Flask路由转换器进阶使用

作者: 测试探索 | 来源:发表于2020-09-10 06:53 被阅读0次
    from flask import Flask,current_app,redirect,url_for
    #werkzeug提供关于路径解析设置的工具,BaseConverter转换器父类
    from werkzeug.routing import BaseConverter
    
    # 创建flask应用对象
    # __name__表示当前的模块名字
    # 模块名,flask以整个模块所在的目录为总目录,默认整个目录中的static为静态目录
    # templates为模板目录
    app = Flask(__name__)
    
    
    # 转换器
    # @app.route("/goods/<int:goods_id>")   转换器类型为int
    @app.route("/goods/<goods_id>")  #不加转换器类型,默认是普通字符串规则(除了/的字符)
    def goods_detail(goods_id):
        """
        定义的视图函数
        :return:
        """
        return "goods detail page %s" % goods_id
    
    #1.定义自己的转换器
    class MobileConverter(BaseConverter):
        def __init__(self,url_map):
            super().__init__(url_map)
            self.regex = r'1[34578]\d{9}'
    
    
    class RegexConverter(BaseConverter):
        def __init__(self,url_map,regex):
            #调用父类的初始化方法
            super().__init__(url_map)
            # 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配
            self.regex = regex
    
        # def to_python(self, value):
        #     print("to_python方法被调用")
        #     # return "abc"
        #
        # def to_url(self, value):
        #     pass
    
    
    #2. 将自定义的转换器添加到flask的应用中,只把类存进去,没有创建对象
    app.url_map.converters["re"] = RegexConverter
    app.url_map.converters["mobile"] = MobileConverter
    
    @app.route("/send/<re(r'1[34578]\d{9}'):mobile_num>")
    # @app.route("/send/<mobile:mobile_num>")
    def send_sms(mobile_num):
        return "send sms to %s " % mobile_num
    
    @app.route("/index")
    def index():
        url = url_for("send_sms",mobile_num="18922222222")
        # 路径/send/18922222222
        return redirect(url)
    
    if __name__ == '__main__':
        # 通过url_map可以查看整个flask中路由信息
        print(app.url_map)
        app.run(debug=True)
    
    运行结果

    相关文章

      网友评论

          本文标题:Flask路由转换器进阶使用

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