You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:59