例如访问:/user/index/index_config
则自动访问/user 目录里 index.py文件里的 index_config 方法
实现代码
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 响应。
-
导入模块:
from flask import Flask, jsonify import importlib import os from datetime import datetime
Flask
:Flask 框架的核心类。jsonify
:用于将 Python 数据结构转换为 JSON 响应。importlib
:用于动态导入模块。os
:用于设置环境变量。datetime
:用于获取当前时间。
-
创建 Flask 应用实例:
app = Flask(__name__)
-
定义
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 响应,其中包含状态码、数据、消息、时间戳、调试信息和展示标志。
- 返回的响应和状态码用于向客户端提供统一的接口响应格式。
-
定义动态路由
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 错误。
-
运行应用:
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 响应格式,包含了状态码、响应数据、消息和调试信息。动态路由允许根据路径自动处理不同的模块和函数调用,实现灵活的接口处理。
温馨提示
使用这种方式 有一定的安全隐患,
可以考虑在被调用的地方加入拦截
或者在调用之前 进行白名单管理