Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django项目中的自定义statup代码应该位于何处?_Python_Django_Gunicorn_Startup_Wsgi - Fatal编程技术网

Python django项目中的自定义statup代码应该位于何处?

Python django项目中的自定义statup代码应该位于何处?,python,django,gunicorn,startup,wsgi,Python,Django,Gunicorn,Startup,Wsgi,当我在当前项目中切换到gunicorn时,我明白我在启动时处理模型缓存的方式不是一种好方法 背景 应用程序名称:网站 项目名称:个人_cms 有几个型号我配备了加载方法 通常,每当模型中发生变化时,信号就会调用这些方法。为了在启动服务器时加载它们,我在wsgi.py中添加了以下内容: 问题 上面的代码可以工作,但只在使用python manage.py runserver时使用,而不是gunicorn personal_cms.wsgi:application。据我所知,原因是运行manage.

当我在当前项目中切换到gunicorn时,我明白我在启动时处理模型缓存的方式不是一种好方法

背景 应用程序名称:网站 项目名称:个人_cms 有几个型号我配备了加载方法

通常,每当模型中发生变化时,信号就会调用这些方法。为了在启动服务器时加载它们,我在wsgi.py中添加了以下内容:

问题 上面的代码可以工作,但只在使用python manage.py runserver时使用,而不是gunicorn personal_cms.wsgi:application。据我所知,原因是运行manage.py有一个特定的上下文。没有它,gunicorn点击wsgi.py时不会加载应用程序:


现在想想,从项目的wsgi.py加载应用程序的模型似乎是错误的。那么,我应该在哪里调用load方法,以便在启动时缓存模型,而不管选择的是wsgi服务器?

所有启动代码都应该放在AppConfig的ready方法中。然后在ibu应用程序上引用config类,而不是应用程序名称。这保证在启动时调用


请看

我尝试了它,但问题是,当我第一次初始化应用程序docker compose up表的实例时,它还不存在,我得到了一个django.db.utils.ProgrammingError:1146,表“cms\u db\u prod.website\u somemodel”不存在。在这一点上我有点犹豫:即使在entrypoint.sh中添加python manage.py migrate,我也会遇到这个错误,但这与我认为devop部分不正确有关。谢谢你的回答@Daniel
class SomeModel(models.Model):
    something      = models.CharField(max_length=60)
    something_else = models.URLField()

    @classmethod
    def load(cls):
        cache.set('{}'.format(cls.__name__), cls.objects.all(), None)
import os

from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'personal_cms.settings')

from website.models import SomeModel, SomeOtherModel
SomeModel.load()
SomeOtherModel.load()

application = get_wsgi_application()
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.