【问题标题】:Where in Django can I run startup to load data?在 Django 中,我可以在哪里运行启动来加载数据?
【发布时间】:2021-03-09 09:52:14
【问题描述】:

我有一个 django 应用程序,它在 django 启动后将一个巨大的数组加载到内存中以进行进一步处理。

我现在要做的是,加载特定视图后,执行代码加载数组,如下所示:

try:
    load_model = load_model_func()
except:
    #Some exception
    

代码现在很糟糕。我想在启动 django 后创建一个类来加载这个模型,并且我希望能够在应用程序的所有其他方法中的所有其他这个模型中获取这个模型

那么,Django启动后将数据加载到内存中是否有好的做法?

【问题讨论】:

  • “将数据加载到内存中”是什么意思?项目开始服务时数据库信息入内存?这样做的原因是什么,而不是对数据库的请求?
  • @GeancarloMurillo 原因是它是一个大矩阵,在这个应用程序中的所有请求中都使用它来进行数据处理。如果我使用 db,响应时间会急剧增加,所以我需要这个矩阵总是在内存中。加载模型后,它不会进行更新

标签: python django


【解决方案1】:

您可以在应用初始化时运行启动脚本。为此,请在 apps.py 中的 Config 类的 ready 方法中调用脚本,如下所示:

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        <import and run script>

【讨论】:

    【解决方案2】:

    @Ken4scholar 的回答是“在 Django 启动后加载数据的良好做法”方面的一个很好的回应。它并没有真正解决存储/访问它的问题。

    如果除非您重新加载应用程序,否则您的数据不会过期/更改,那么使用 cmets 中建议的缓存是多余的,并且根据您使用的缓存存储,您最终可能仍会从某些数据库中提取数据,从而产生开销。

    您可以简单地将其存储在内存中,就像您已经在做的那样。添加一个额外的类并不会真正添加任何东西,一个简单的全局变量就可以做到。

    考虑这样的事情:

    # my_app/heavy_model.py
    data = None
    
    def load_model():
        global data
        data = load_your_expensive_model()
    
    def get_data():
      if data is None:
          raise Exception("Expensive model not loaded")
      return data
    
    

    在你的配置中(你可以lean more about applications and config here):

    # my_app/app_config.py
    from django.apps import AppConfig
    
    from my_app.heavy_model import load_model
    
    class MyAppConfig(AppConfig):
        # ...
        def ready(self):
            load_model()
    

    那么您可以直接在您的视图中调用my_app.heavy_model.get_data

    ⚠️ 您也可以直接访问全局 data 变量,但最好有一个包装器(如果您以后想围绕它创建更多抽象)。

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 2019-09-07
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多