• 路由本质以及参数


    路由本质以及参数

    from flask import Flask, url_for, redirect
    app = Flask(__name__)
    # @app.route("/")
    # def index(nid):
    def index():
        # print(nid,type(nid))  # 666 <class 'int'>
        return "ok"
    
    # @app.route 的本质就在执行 add_url_rule 这个中的 roule 是路由,endpoint 是路由别名,view_func是响应函数
    #如果 endpoint 不传就是响应的函数名
    
    # app.add_url_rule("/index/<int:nid>", endpoint="index1",view_func=index,methods=["POST","GET"])
    app.add_url_rule("/index/", endpoint="index1",view_func=index,methods=["POST","GET"])
    
    @app.route("/login/",methods=["POST", "GET"])
    def login():
        # 用 endpoint 取路由要用 url_for 在 flask 中导入,也就是反向解析
        print(url_for("index1"))  # /index/
        return  redirect(url_for("index1"))
    
    # 路由参数;methods,可以控制该方法能有哪些请求方式可以访问
    # app.add_url_rule("/index", endpoint="index1",view_func=index,methods=["POST"])
    # 路由参数:有名分组,app.add_url_rule("/index/<int:nid>"响应函数必须用nid来接收
    
    
    if __name__ == '__main__':
        app.run()
    

    总结:

    1. @app.route("/login") 的本质是 app.add_url_rule("/login",view_func=login),所以我们就可以用这两个方式来添加路由
    2. 路由的参数:
      1. endpoint ,做的是反向解析,如果上面添加路由的时候,没有传递 endpoint 就是使用响应函数的函数名,反向解析用url_for(),做解析,这个url_for必须在flask里面导入
      2. methods=["POST","GET"] ,该参数控制路由允许哪些请求方法访问,如果不传,默认只能GET 方法
      3. 路由以及路由转化器。"/index/int:nid",<参数的类型:用哪个变量来接收>,响应函数中的形参的名字必须转化器中一致


    自定义转化器

    # 非重点
    # 1 写类,继承BaseConverter
    # 2 注册:app.url_map.converters['regex'] = RegexConverter
    # 3 使用:@app.route('/index/<regex("d+"):nid>')  正则表达式会当作第二个参数传递到类中
    
    from flask import Flask, url_for
    from werkzeug.routing import BaseConverter
    
    app = Flask(import_name=__name__)
    
    class RegexConverter(BaseConverter):
        """
        自定义URL匹配正则表达式
        """
        def __init__(self, map, regex):
            super(RegexConverter, self).__init__(map)
            self.regex = regex
    
        def to_python(self, value):
            """
            路由匹配时,匹配成功后传递给视图函数中参数的值
            """
            print("to_python",value,type(value))
            return int(value)+1
    
        def to_url(self, value):
            """
            使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
            """
            val = super(RegexConverter, self).to_url(value)
            return val+"222"
    
    # 添加到flask中
    app.url_map.converters['regex'] = RegexConverter
    # 正则匹配处理结果,要交给to_python,to_python函数可以对匹配处理结果做处理
    @app.route('/index/<regex("d+"):nid>')
    def index(nid):
        print("index",nid,type(nid))
        print(url_for('index', nid='888'))
        return 'Index'
    
    if __name__ == '__main__':
        app.run()
    

    总结:

    1 导入from werkzeug.routing import BaseConverter
    2 我写个继承BaseConverter。实现3个方法,def __init__ , def to_python , def to_url
    3 将上面的类注册到app.url_map.converters['regex'] = RegexConverter中
    4 然后就可以在路由转化器中使用3中的regex("传正则")
    5 当路由被访问以后。regex("传正则")会匹配结果,把结果传递to_python,我们可以进行再次处理,to_python处理好的结果,会传递给响应函数的形参
    6 当用url做反向解析的时候,传递给路由转化器的参数,会经过to_url,进行处理。处理以后,在拼接到路由。
    

  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1105:数组逆序重存放
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1106:年龄与疾病
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1105:数组逆序重存放
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1104:计算书费
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1104:计算书费
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1104:计算书费
    configparser
    python中split()、os.path.split()函数用法
    DOS命令
    adb安装及使用
  • 原文地址:https://www.cnblogs.com/kai-/p/12521107.html
Copyright © 2020-2023  润新知