zoukankan      html  css  js  c++  java
  • Flask(5)- 动态路由

    前言

    • 前面几篇文章讲的路由路径(rule)都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发相应的处理函数
    • 这样无法处理复杂的情况,比如常见的一个课程分类下有很多个课程,那么他们的 path 可能是 /course/class_1,/course/class_2,/course/class_3...仅最后的序号不同,其他部分都是相同的,如果每一条 path 都写一个单独的视图函数来处理,那复用性会很差,代码量也会很多
    • 所以咱们要使用动态路由,路由中的路径是一个包含有参数的模板,这样就可以匹配多条路径

    静态路由的栗子

    网站中有 3 个用户 tom、jerry、mike,提供了 3 个路由访问这 3 个用户的信息

    路由视图函数
    /user/tom show_user_tom()
    /user/jerry show_user_jerry()
    /user/mike show_user_mike()
    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/user/tom')
    def show_user_tom():
        return 'My name is tom'
    
    
    @app.route('/user/jerry')
    def show_user_jerry():
        return 'My name is jerry'
    
    
    @app.route('/user/mike')
    def show_user_mike():
        return 'My name is mike'
    
    
    if __name__ == '__main__':
        app.run()

    静态路由存在的问题

    三个视图函数的功能逻辑是相同的,存在明显的逻辑代码重复

    动态路由

    Flask 中动态路由是指带有参数的页面路径,大概格式如下

    /prefix/<参数>

    它是一个模板,可以匹配多条路径,将参数放置在符号 < > 之间

    将上面的静态路由栗子优化成动态路由

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/user/<name>')
    def show_user(name):
        return 'My name is %s' % name
    
    
    if __name__ == '__main__':
        app.run()
    • 匹配所有以 /user/ 开头的路径
    • 视图函数 show_user 有一个参数 name
    • 假设实际的路径是 /user/poloyy,那么会与 /user/<name> 匹配成功,并且将 poloyy 存储到参数 name 中

    实际请求结果

    转换器

    在 Flask 中,动态路由的参数类型默认是 string,但是也可以指定其他类型,比如数字 int 等

    类型说明
    string 默认,可以不用写
    int 整数
    float 同 int,但是仅接受浮点数
    path 和 string 相似,但接受斜线

    转换器的栗子代码

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/user/<name>')
    def show_user(name):
        return 'My name is %s' % name
    
    
    @app.route('/age/<int:age>')
    def show_age(age):
        return 'age is %d' % age
    
    
    @app.route('/price/<float:price>')
    def show_price(price):
        return 'price is %f' % price
    
    
    @app.route('/path/<path:name>')
    def show_path(name):
        return 'path is %s' % name
    
    
    if __name__ == '__main__':
        app.run()

    上述代码定义了四条动态路由

    动态路由参数类型参数视图函数
    /user/<name> 字符串 name show_user
    /age/<int:age> int age show_age
    /price/<float:price> float price show_price
    /path/<path:name> path name show_path

    /user/<name> postman 发起请求的结果

    直接看上面的栗子截图就好了,这里给一个踩坑的栗子

    如果 <name> 传了包含 / 的话,会报 404 哦

    /age/<int:age> postman 发起请求的结果

    传整数

    传浮点点数

    会直接报 404 哦! 

    /price/<float:price> postman 发起请求的结果

    传浮点数

      

    传整数

    会直接报 404 哦!

    /path/<path:name> postman 发起请求的结果

    包含 / 的时候也可以正常请求

    没有 / 的时候,和 string 类型一样

    一个动态路由包含多个参数

    @app.route('/all/<path:path>/name/<string:name>/age/<int:age>/price/<float:price>')
    def show_all(name, path, age, price):
        return f"path is {path}
    name is {name}
    age is {age}
    price is {price}"

    postman 发起请求的结果

    总结

  • 相关阅读:
    SQL注入(转载)
    htmlTable To jpeg
    oracle 中文乱码 全变成 '靠'
    oracle 跨库查询
    oracle 备份还原数据库
    jquery 非异步读取数据
    oracle 游标 简单使用
    自增列的一种方法收藏
    oracle 导出txt 数据,excel 数据
    oracle 简单job
  • 原文地址:https://www.cnblogs.com/poloyy/p/14994738.html
Copyright © 2011-2022 走看看