• Flask03 路由控制(转换器)、反转、请求方法控制


    1 提出问题

      如何实现前端传过去的路径时动态的(即:多个url对应一个url视图函数)

      例如:

        浏览器中输入  http://127.0.0.1:5000/test/good/  或者  http://127.0.0.1:5000/test/fury/ 时,在后台执行的都是同一个url视图函数

    2 解决问题

      利用flask的转换器实现  

      2.1 什么是转换器

        @app.route('/test/<string:let>/', endpoint="test01") 中 <> 的部分就叫做转换器

          代码解释:路径的最后一部分可以是任意值,但是这个值得类型必须是string类型

        

    from flask import Flask
    app = Flask(__name__)
    @app.route("/")
    def index():
        return "这是主页面, hello"
    
    @app.route('/test/<string:let>/', endpoint="test01")
    def test(let):
        return "多个url对应一个url视图函数  " + let
    
    print(app.url_map)
    if __name__ == "__main__":
        app.run(debug=True)
    View Code

      2.2 转换器的种类

        default  默认转换器(注意:默认转换器就是字符串转换器)

        string  字符串转换器,不能识别  /

        path  路径转换器,可以看成是string转换器的加强版,可以识别  /

          点睛:我们在访问静态文件时之所以可以通过路径进行访问,是因为静态文件的转换器时path类型

        int  整型转换器

        float  浮点型转换器

          点睛:int转换器只能识别整数,float转换器只能识别浮点型

          点睛:在url视图函数中会自动将获取到的数据转换成相应的类型

        any  多选一类型转换器

        uuid  UUID类型转换器

          点睛:在url视图函数中获取到的数据时UUID类型

          点睛:如何获取uuid

            form uuid import uuid4

            uuid4()

            注意: uuid4() 返回的是一个UUID类型的类

    from flask import Flask
    app = Flask(__name__)
    @app.route("/")
    def index():
        return "这是主页面, hello"
    
    @app.route('/test/<string:let>/', endpoint="test01")
    def test(let):
        return "字符串类型转换器  " + let
    
    @app.route('/test/<let>', endpoint='test02')
    def test(let):
        return "默认类型转换器  " + let
    
    @app.route('/test/<path:let>/', endpoint='test03')
    def test(let):
        return "path类型转换器   " + let
    
    @app.route('/test/<int:let>/', endpoint='test04')
    def test(let):
        return 'int类型转换器    ' + str(let)
    
    @app.route('/test/<float:let>/', endpoint='test05')
    def test(let):
        return 'float类型转换器  ' + str(let)
    
    @app.route('/test/<any(fury,zeus,"123","12.34"):let>/', endpoint='test06')
    def test(let):
        return 'any类型转换器    ' + let
    
    @app.route('/test/<uuid:let>/', endpoint='test07')
    def test(let):
        return 'uuid雷翔转换器   ' + let
    
    print(app.url_map)
    if __name__ == "__main__":
        app.run(debug=True)
    View Code

    3 提出问题

      如何根据端点去寻找路径

    4 解决问题

      通过反转的方式实现

      补充知识点:url和url视图函数是怎么对应的

        flask中url跟视图函数并不是直接对应的,而是有一个中间者-endpoint

        url  ->  endpoint  ->  view_function

          根据url找到对应的端点,在根据对应的端点找到url视图函数;素以端点时url和url视图函数之间的桥梁,所以我们可以根据端点找到对应的路径  

      4.1 如何通过 url_for 方法来获取路径

        4.1.1 从flask模块中引入url_for

          from flask import url_for

        4.1.2 利用 ur_for 获取路径

          path = url_for('myTest')

        

    from flask import Flask
    from flask import url_for
    app = Flask(__name__)
    @app.route('/')
    def index():
        path = url_for('myTest')
        print(path)
        return '这里还是主页'
    @app.route('/test/', endpoint='myTest')
    def test():
        return '这里是测试页面'
    print(app.url_map)
    if __name__ == '__main__':
        app.run()
    View Code

      4.2 url_for 小应用

        把通过端点获取到的路径放到一个html中去,这样无论如何修改url路径,只要端点不变那么就不用修改html中的路径

    from flask import Flask
    from flask import url_for
    app = Flask(__name__)
    @app.route('/')
    def index():
        path = url_for('myTest')
        print(path)
        html = '''
            <a href="%s">点击进入测试页面</a>
        '''%path
        return html
    @app.route('/test/', endpoint='myTest')
    def test():
        return '这里是测试页面'
    print(app.url_map)
    if __name__ == '__main__':
        app.run(debug = True)
    View Code

      4.3 通过蓝图的端点获取蓝图路径

        和普通路由的区别:蓝图的端点在前面需要加上蓝图名

    from flask import Flask
    from flask import url_for
    from flask import Blueprint
    
    app = Flask(__name__)
    
    bp = Blueprint('movie', __name__)
    @bp.route('/action/', endpoint='actionMovie')
    def action():
        return '动作电影专区'
    
    app.register_blueprint(bp)
    
    @app.route('/')
    def index():
        path = url_for('movie.actionMovie')
        print(path)
        html = '''
            <a href="%s">点击进入动作电影</a>
        '''%path
        return html
    @app.route('/test/', endpoint='myTest')
    def test():
        return '这里是测试页面'
    print(app.url_map)
    if __name__ == '__main__':
        app.run(debug = True)
    View Code

      4.4 带变量的路径反转

    from flask import Flask
    from flask import url_for
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        path = url_for("test01", let='fury')
        return '这是主页    ' + path
    
    @app.route('/test/<string:let>/', endpoint="test01")
    def test(let):
        return '测试页面    ' + let;
    
    print(app.url_map)
    
    if __name__ == '__main__':
        app.run(debug = True)
    View Code
    from flask import Flask
    from flask import url_for
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        path = url_for("test01", let='fury', name='zeus')
        return '这是主页    ' + path
    
    @app.route('/test/<string:let>/', endpoint="test01")
    def test(let):
        return '测试页面    ' + let;
    
    print(app.url_map)
    
    if __name__ == '__main__':
        app.run(debug = True)
    View Code

    5 控制请求方式

      5.1 请求方式

        POST GET HEAD OPTIONS

          点睛:有get就默认有head,options永远都有

      5.2 如何修改请求方式

        注意:默认情况下有三种请求方式

          

        

      5.3 如何通过python实现请求

        利用pip安装requests包

          pip install requests

        导入相关方法

          from requests import get, post, head, options
        调用相关方法
          resp = get(url)

        查看相应头部信息

          resp.headers

        查看响应实体信息
          resp.content.decode('utf-8')

        

  • 相关阅读:
    java基础的第二轮快速学习!day08
    java基础的第二轮快速学习!day07
    java基础的第二轮快速学习!day06
    Jsp复习(详细的知识点)day01
    Struts2,大爷你好!第二天补一发笔记
    java基础的第二轮快速学习!day05
    Struts2,大爷你好!第二天
    java基础的第二轮快速学习!day04
    Struts2,大爷你好!第一天
    java基础的第二轮快速学习!day03
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/7491694.html
Copyright © 2020-2023  润新知