当前位置: 首页 > news >正文

python使用flask实现自动根据url寻找对应目录/文件/方法,实现动态路由

例如访问:/user/index/index_config
则自动访问/user 目录里 index.py文件里的 index_config 方法

在这里插入图片描述
在这里插入图片描述

实现代码

from flask import Flask,jsonifyapp = Flask(__name__)def reg_func(code, data, msg, debug=None, show=False):return jsonify({'code': code,'data': data,'msg': msg,'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),'debug': debug,'show': show}), code@app.route('/<path:path>', methods=['GET', 'POST'])
def dynamic_route(path):try:# 将路径分割成模块路径和函数名parts = path.split('/')module_path = '.'.join(parts[:-1])if len(parts) < 3:return reg_func(404, None, '真的没有这个接口啊')user_or_admin = parts[-3]py_name = parts[-2]function_name = parts[-1]if not user_or_admin or not py_name or not function_name:return reg_func(404, None, '真的没有这个接口啊')# 动态导入模块module = importlib.import_module(module_path)# 获取函数func = getattr(module, function_name)# 调用函数return func()except (ModuleNotFoundError, AttributeError) as e:return reg_func(404, None, '可能,这是个错误')if __name__ == '__main__':# 确保Python能找到你的模块os.environ['PYTHONPATH'] = os.path.dirname(os.path.abspath(__file__))app.run(debug=True, port=8880, host='0.0.0.0')

代码详解

chatgpt协助整理

代码含义

这段代码实现了一个动态路由的 Flask 应用,它根据 URL 路径动态加载和调用模块中的函数,并返回相应的 JSON 响应。

  1. 导入模块

    from flask import Flask, jsonify
    import importlib
    import os
    from datetime import datetime
    
    • Flask:Flask 框架的核心类。
    • jsonify:用于将 Python 数据结构转换为 JSON 响应。
    • importlib:用于动态导入模块。
    • os:用于设置环境变量。
    • datetime:用于获取当前时间。
  2. 创建 Flask 应用实例

    app = Flask(__name__)
    
  3. 定义 reg_func 函数

    def reg_func(code, data, msg, debug=None, show=False):return jsonify({'code': code,'data': data,'msg': msg,'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),'debug': debug,'show': show}), code
    
    • 该函数生成一个标准的 JSON 响应,其中包含状态码、数据、消息、时间戳、调试信息和展示标志。
    • 返回的响应和状态码用于向客户端提供统一的接口响应格式。
  4. 定义动态路由 dynamic_route

    @app.route('/<path:path>', methods=['GET', 'POST'])
    def dynamic_route(path):try:parts = path.split('/')module_path = '.'.join(parts[:-1])if len(parts) < 3:return reg_func(404, None, '真的没有这个接口啊')user_or_admin = parts[-3]py_name = parts[-2]function_name = parts[-1]if not user_or_admin or not py_name or not function_name:return reg_func(404, None, '真的没有这个接口啊')module = importlib.import_module(module_path)func = getattr(module, function_name)return func()except (ModuleNotFoundError, AttributeError) as e:return reg_func(404, None, '可能,这是个错误')
    
    • 解析 URL 路径,将其拆分成模块路径、模块名称和函数名称。
    • 动态导入指定的模块,并获取模块中的函数。
    • 调用函数并返回其结果。如果模块或函数不存在,返回 404 错误。
  5. 运行应用

    if __name__ == '__main__':os.environ['PYTHONPATH'] = os.path.dirname(os.path.abspath(__file__))app.run(debug=True, port=8880, host='0.0.0.0')
    
    • 设置 PYTHONPATH 确保 Python 可以找到模块。
    • 启动 Flask 应用,监听所有 IP 地址的 8880 端口,并启用调试模式。

总结

这段代码定义了一个 Flask 应用,它能够根据请求的 URL 路径动态导入和调用 Python 模块中的函数。通过 reg_func 函数,应用提供了一个统一的 JSON 响应格式,包含了状态码、响应数据、消息和调试信息。动态路由允许根据路径自动处理不同的模块和函数调用,实现灵活的接口处理。

温馨提示

使用这种方式 有一定的安全隐患,

可以考虑在被调用的地方加入拦截

或者在调用之前 进行白名单管理


http://www.mrgr.cn/news/1054.html

相关文章:

  • xss GAME (xss漏洞攻击1-8)
  • html文件运行后界面反馈xxx拒绝连接
  • leetcode 552. 学生出勤记录 II
  • 用ChatGPT出题,完全做不完
  • 24 初入python
  • 每日一题,力扣leetcode Hot100之189.轮转数组
  • 8月15日笔记
  • 贝克资本再发力,新兴数字项目引领亚洲投资新潮
  • java 函数接口Consumer简介与示例【函数式编程】【Stream】
  • 解决k8s分布式集群,子节点加入到主节点失败的问题
  • golang Kratos 概念
  • 排序算法刷题【排序链表】
  • 1、.Net UI框架:MAUI - .Net宣传系列文章
  • 车载以太网自动化测试套件—AETP.UDS
  • 基于RabbitMQ的消息监听器
  • Xshell中弹出“ssh服务器拒绝了密码请再试一次”时,如何解决
  • 目标检测之数据增强
  • 腾讯云 AI 代码助手四大基础功能介绍
  • K8S 探针
  • 归并排序算法及优化(java)