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

Django启动时实例化自定义类并在views.py中访问的方法

Django启动时全局实例化自定义类的实现方案

核心逻辑:不需要通过URL路由传递全局实例,Django提供了标准的启动钩子,初始化完成的单例实例存放在独立公共模块中,所有业务代码直接导入即可调用。你之前尝试给视图函数加instantiatedClass :MyClass形参的方式不可行,Django视图默认只会接收request对象、URL路径解析出的参数,全局实例不需要走参数传递链路。

方案1:最简实现(单例模块存储,适配90%场景)

  1. 新建独立公共文件存放全局实例,比如在对应app目录下创建global_instances.py:
# 自定义类可以直接写在这里,也可以从其他业务模块导入
class MyClass:
    def __init__(self):
        self.a = 3
    def foo(self):
        return self.a

# 预留实例变量,启动时完成赋值
my_class_instance = None
  1. 利用Django官方提供的AppConfig.ready()钩子触发实例初始化,避免开发模式热重载、模块重复导入导致的多次实例化问题。找到对应app目录下的apps.py,修改配置如下:
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    # 替换为你实际的app名称
    name = 'your_app_name'

    def ready(self):
        # 服务完全启动后执行该方法,仅运行一次
        from .global_instances import MyClass
        from . import global_instances
        # 完成实例初始化
        global_instances.my_class_instance = MyClass()

如果你的自定义类初始化不需要依赖完整Django环境(比如不需要读配置、连数据库),也可以直接在global_instances.py顶层完成实例化,跳过ready()方法里的赋值逻辑。

  1. 业务代码中直接导入实例使用即可,不需要额外传参:
# views.py
from django.http import HttpResponse
from .global_instances import my_class_instance

def index(request):
    a = my_class_instance.foo()
    return HttpResponse(f"{a} is your var.")

在urls.py、模型方法、工具函数中需要调用实例时,用同样的导入方式即可。

方案2:中间件挂载(适配需要统一注入请求上下文的场景)

如果你希望实例和请求对象绑定,可以通过自定义中间件实现:

  1. 在app目录下新建middlewares.py:
from .global_instances import my_class_instance

class GlobalInstanceMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 将初始化好的实例挂载到request对象上
        request.my_class_instance = my_class_instance
        response = self.get_response(request)
        return response
  1. 打开项目settings.py,在MIDDLEWARE配置列表中注册自定义中间件:
MIDDLEWARE = [
    # 保留原有默认中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    # ... 其他默认中间件
    # 新增你的自定义中间件
    'your_app_name.middlewares.GlobalInstanceMiddleware',
]
  1. 视图中直接从request对象获取实例调用:
def index(request):
    a = request.my_class_instance.foo()
    return HttpResponse(f"{a} is your var.")

避坑提醒

  • 不要把实例化逻辑直接写在urls.py或者views.py顶层:开发模式热重载、多进程部署时很容易出现重复实例化的问题,AppConfig.ready()是官方推荐的服务启动后执行一次性逻辑的入口。
  • 如果你的类初始化涉及重IO操作(比如加载大模型、建立数据库长连接、读取大文件到内存),不要在模块导入阶段就执行,放到ready()方法中处理,确保Django运行环境完全初始化后再跑重逻辑。
  • 多进程部署(比如Gunicorn开多个worker、uWSGI多进程模式)时,每个worker进程会独立初始化一份实例,属于正常现象。如果需要跨进程共享实例状态,需要单独搭建缓存服务或者独立的状态服务,单进程内的全局实例无法跨进程共享。

内容的提问来源于stack exchange,提问作者Oh Wan Sik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:06:22