有关flask路由app.route,路由参数的各种用法解析【非常全面】

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。

🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。

所属的专栏:flask框架零基础,进阶应用实战教学

景天的主页:景天科技苑

文章目录

  • flask路由
    • 1.路由的基本定义
    • 2.路由参数接收方式
      • 1.接收任意路由参数
      • 2.接收限定类型参数
      • 3.自定义路由参数转换器

        flask路由

        1.路由的基本定义

        什么是路由?

        路由就是一种映射关系。是绑定应用程序(视图)和url地址的一种一对一的映射关系!

        我们在开发过程中,编写项目时所使用的路由往往是指代了框架/项目中用于完成路由功能的类,这个类一般就是路由类,简称路由。

        路由和视图的名称必须全局唯一,不能出现重复,否则报错。

        路由重复,走先声明的,视图函数重复直接报错。

        代码示例:

        # 1. 导入flask核心类
        from flask import Flask
        # 2. 初始化web应用程序的实例对象
        app = Flask(__name__)
        # 开启debug模式
        app.config["DEBUG"] = True
        # 参数1:rule设置当前视图的路由地址
        # 参数2:methods,设置当前视图的HTTP请求方法,允许一个或多个方法,不区分大小写,如果使用非设置的请求方法来访问,会报405错误
        @app.route(rule="/", methods=["get", "post"])
        def index():
            return "

        hello flask1

        " if __name__ == '__main__': # 3. 运行flask提供的测试web服务器程序 app.run(host="0.0.0.0", port=5000)

        如下,使用非指定请求方法来访问,会报错

        使用postman来使用post请求

        使用get请求测试,可以正常拿到响应数据

        2.路由参数接收方式

        flask中,url可以传递路由参数,有2种方式:

        路由参数就是url路径的一部分。

        1.接收任意路由参数

        # 1. 导入flask核心类
        from flask import Flask
        # 2. 初始化web应用程序的实例对象
        app = Flask(__name__)
        # 开启debug模式
        app.config["DEBUG"] = True
        @app.route(rule="/", methods=["get", "post"])
        def index():
            return "

        hello flask1

        " """ 路由参数的传递 尖括号圈住,里面写上参数变量名 在视图中即可通过参数列表按命名来接收 接收参数时,如果没有在设置路由中设置参数的类型,则默认参数类型为字符串类型 """ @app.route("/goods//") def goods(gid, cid): print(gid, type(gid)) print(cid, type(cid)) return f"显示cid={cid},gid={gid}的商品信息" if __name__ == '__main__': # 3. 运行flask提供的测试web服务器程序 app.run(host="0.0.0.0", port=5000)

        浏览器访问,拿到url输入的数据

        2.接收限定类型参数

        限定路由参数的类型,flask系统自带转换器编写在werkzeug/routing/converters.py文件中。底部可以看到以下字典:

        在这个文件的最后配置

        # converters用于对路由中的参数进行格式转换与类型限定的
         t.Mapping[str, t.Type[BaseConverter]是为了告诉读者,里面数据左边是个字符串,右边是数据类型
        python3.6新增了一个typing模块,让我们在编写python代码的变量时,可以同时设置变量的数据类型
        DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = { "default": UnicodeConverter, # 默认类型,也就是string
            "string": UnicodeConverter, # 字符串,不包含 /
            "any": AnyConverter,    # 任意类型
            "path": PathConverter,  # 也是字符串,但是包含了 /
            "int": IntegerConverter,
            "float": FloatConverter,
            "uuid": UUIDConverter,
        }
        

        系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

        代码:

        # 1. 导入flask核心类
        from flask import Flask
        # 2. 初始化web应用程序的实例对象
        app = Flask(__name__)
        # 开启debug模式
        app.config["DEBUG"] = True
        @app.route(rule="/", methods=["get", "post"])
        def index():
            return "

        hello flask1

        " """ 通过路由转换器来对路由参数显示格式转换和限制类型 """ @app.route("/goods//") def goods(gid, cid): print(gid, type(gid)) print(cid, type(cid)) return f"显示cid={cid},gid={gid}的商品信息" if __name__ == '__main__': # 3. 运行flask提供的测试web服务器程序 app.run(host="0.0.0.0", port=5000)

        此时对于传入非指定类型的参数,则会报404错误

        传指定类型参数,才能正常访问

        3.自定义路由参数转换器

        也叫正则匹配路由参数.

        在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

        具体实现步骤为:

        • 导入转换器基类BaseConverter:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
        • 自定义转换器:自定义类继承于转换器基类BaseConverter
        • 添加转换器到默认的转换器字典DEFAULT_CONVERTERS中
        • 使用自定义转换器实现自定义匹配规则

          代码实现

          # 1. 导入flask核心类
          from flask import Flask
          # 2. 初始化web应用程序的实例对象
          app = Flask(__name__)
          # 开启debug模式
          app.config["DEBUG"] = True
          """
          自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
          """
          from werkzeug.routing.converters import BaseConverter
          #在我们自定义的类里面写正则规则,并要继承BaseConverter
          class MobileConverter(BaseConverter):
              """手机号参数类型的转换器"""
              regex = r"1[3-9]\d{9}"
          # 把自定义路由转换器类注册到flask项目中,中括号里面的参数我们下面路由转换器类要用到
          app.url_map.converters["mob"] = MobileConverter
          @app.route("/sms/")
          def sms(mobile):
              return f"发送短信给手机号:{mobile}的用户"
          if __name__ == '__main__':
              # 3. 运行flask提供的测试web服务器程序
              app.run(host="0.0.0.0", port=5000)
          

          运行程序访问,但凡不满足正则规则的请求,都无法正常访问

          手机号太短

          包含非数字

          满足正则要求的手机号,可以正常访问

          但是这样,我们写个类就把正则规则定死了,不方便其他路由调用

          因此,我们需要优化,我们需要根据实际需要的正则来分别自定义

          此时,我们需要将正则作为参数传进去

          • 导入转换器基类

            from werkzeug.routing.converters import BaseConverter

          • 自定义转换器

            先看下父类

            class RegexConverter(BaseConverter):
                def __init__(self, map, *args, **kwargs):
                    super().__init__(map, *args, **kwargs)  #我们不用进行类型限定
                    self.regex = args[0]
            
            - 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
            app.url_map.converters["re"] = RegexConverter
            - 使用转换器去实现自定义匹配规则,当前此处定义的规则是:手机号码 
            """
            自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
            """
            from werkzeug.routing.converters import BaseConverter
            class RegexConverter(BaseConverter):
                def __init__(self, map, *args, **kwargs):
                    super().__init__(map, *args, **kwargs)
                    self.regex = args[0]
            app.url_map.converters["re"] = RegexConverter
            @app.route("/sms/")
            def sms(mobile):
                return f"发送短信给手机号:{mobile}的用户"
            @app.route("/goods/")
            def goods(id):
                return f"显示商品id={id}的信息"
            

            完整代码,包含各种注释解释:

            # 1. 导入flask核心类
            from flask import Flask
            # 2. 初始化web应用程序的实例对象
            app = Flask(__name__)
            # 开启debug模式
            app.config["DEBUG"] = True
            """
            自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
            """
            from werkzeug.routing.converters import BaseConverter
            #注意,自定义的类需要继承BaseConverter,并且要重载父类初始化方法,初始化父类,接收re的参数
            class RegexConverter(BaseConverter):
                def __init__(self, map, *args, **kwargs):
                    super().__init__(map, *args, **kwargs)
                    self.regex = args[0]
            #中括号里面的值 re,就是我们在路由定义转换器类时需要调用的
            app.url_map.converters["re"] = RegexConverter   #这个就是我们自定义的类
            @app.route("/sms/")  #这样,每次路由在参数正则定义式,就作为参数传给我们定义的类
            def sms(mobile):
                return f"发送短信给手机号:{mobile}的用户"
            @app.route("/goods/")  #此时传的是id的正则,只限制数字
            def goods(id):
                return f"显示商品id={id}的信息"
            if __name__ == '__main__':
                # 3. 运行flask提供的测试web服务器程序
                app.run(host="0.0.0.0", port=5000)
            

            如果我们随便输入参数,则访问不到

            输入正确的手机号可以访问到

            发送正确的商品id,也可以访问到