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

例如访问:/user/index/index_config

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


实现代码

python 复制代码
from flask import Flask,jsonify

app = 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. 导入模块:

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

    python 复制代码
    app = Flask(__name__)
  3. 定义 reg_func 函数:

    python 复制代码
    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:

    python 复制代码
    @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. 运行应用:

    python 复制代码
    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 响应格式,包含了状态码、响应数据、消息和调试信息。动态路由允许根据路径自动处理不同的模块和函数调用,实现灵活的接口处理。

温馨提示

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

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

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

相关推荐
xiaoye-duck23 分钟前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚1 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
10年前端老司机1 小时前
Milvus 8种检索能力实践
数据库·python·agent
FRing032 小时前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光2 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
starzy19902 小时前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_2 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
大草原的小灰灰2 小时前
LLM应用的标准开发框架LangChain(八)- 中间件
python·中间件·langchain
卷无止境2 小时前
百万 token 时代的真相:主流大模型上下文窗口与最大输出的横向对比分析
人工智能·python
用户298698530143 小时前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown