Django中如何仅读取一次DataFrame并在视图中复用
解决Django视图重复读取CSV文件的问题
当然可行!你碰到的这个问题在Django里挺常见的——就是想复用初始化的资源,避免每次请求都重复做IO操作。直接往settings里塞确实不太合适,还容易踩加载顺序的坑,给你两个靠谱的实现思路:
方案1:利用Django App的ready()方法(推荐)
Django启动时,每个注册的App都会调用ready()方法,这是初始化全局资源的最佳时机。
步骤1:修改App的apps.py
找到你的App目录下的apps.py(如果没有就新建一个),重写ready()方法来加载CSV文件:
from django.apps import AppConfig import pandas as pd import os from django.conf import settings class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' # 替换成你的App名称 csv_df = None # 用来存储加载后的DataFrame def ready(self): # 用绝对路径避免相对路径的坑 csv_full_path = os.path.join(settings.BASE_DIR, 't.csv') # 服务器启动时仅执行一次加载 self.csv_df = pd.read_csv(csv_full_path)
步骤2:在settings.py中注册App的Config类
确保INSTALLED_APPS里注册的是上面的Config类,而不是单纯的App名称:
INSTALLED_APPS = [ # ... 其他App 'your_app_name.apps.YourAppConfig', # 替换成你的Config路径 ]
步骤3:在视图中复用DataFrame
from django.http import JsonResponse from your_app_name.apps import YourAppConfig def view(request): # 直接获取已加载好的DataFrame df = YourAppConfig.csv_df y = parse_some_parameters(request) if request.method == "POST": # 建议用copy()创建副本,避免多请求同时修改同一个DF导致数据混乱 x = do_something(df.copy(), y) return JsonResponse(x)
方案2:使用模块级全局变量
这个方法更简单,适合快速实现:在一个单独的模块里定义全局变量,Django启动时该模块只会被导入一次,所以CSV只会加载一次。
步骤1:创建数据模块
在你的App目录下新建data.py:
import pandas as pd import os from django.conf import settings # 服务器启动时自动执行加载,模块仅导入一次 csv_full_path = os.path.join(settings.BASE_DIR, 't.csv') global_df = pd.read_csv(csv_full_path)
步骤2:在视图中导入使用
from django.http import JsonResponse from your_app_name.data import global_df def view(request): df = global_df.copy() # 同样建议用副本保证线程安全 y = parse_some_parameters(request) if request.method == "POST": x = do_something(df, y) return JsonResponse(x)
关键注意事项
- 为什么不推荐放settings里?:settings是配置文件,加载顺序特殊,容易引发循环导入,而且把业务数据放在配置里不符合设计规范。
- 为什么要copy()?:Pandas的DataFrame是可变对象,如果多个请求同时修改同一个DF实例,会导致数据错乱。如果你的
do_something只是读取数据不修改DF,可以省略,但保险起见还是加上。 - 更新CSV怎么办?:上面的方法都是启动时加载一次,若CSV文件需要更新,你需要重启服务器,或者可以扩展一个手动触发重新加载的接口(比如用管理员权限调用的视图,重新读取CSV覆盖全局变量)。
内容的提问来源于stack exchange,提问作者broccoli
相关产品推荐
相关产品推荐

