Django代码仅在开发和生产中执行

时间:2018-12-21 11:53:05

标签: python django

我只需要在开发或生产环境中执行一些内务处理代码。不幸的是,所有管理命令的执行都类似于runserver。有什么干净的方法可以对执行环境进行分类并有选择地运行代码。

我在sys.argv中看到了一些解决方案,例如“ runserver” 但不适用于生产。而且看起来不是很干净。 django是否提供任何内容来对执行这些代码的所有这些不同场景进行分类?

修改

真正的问题是,一旦应用程序加载了一些经常访问的数据,我们就需要初始化本地缓存。通常,我想获取一些特定信息的DB并将其缓存(当前在内存中)。问题是,当尝试获取数据库时,可能不会创建表,实际上可能根本没有创建迁移文件。因此,当我运行makemigrations / migrate时,它将运行此代码,尝试从数据库中获取数据,并抛出错误,指出表不存在。但是,如果我不能运行makemigration / migrate,将没有表,这是我要避免的循环。这部分代码将对所有管理命令运行,但是我想将其执行限制为仅在应用实际服务于请求时(即需要缓存时),而不对任何管理命令(包括用户定义的命令)执行

```python

from django.apps import AppConfig
from my_app.signals import app_created


class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        import my_app.signals
        # Code below should be executed only in actual app execution
        # And not in makemigration/migrate etc management commands
        app_created.send(sender=MyAppConfig, sent_by="MyApp")

```

Q)发送由应用创建的信号以执行应用,而不是执行诸如makemigrations,migration等管理命令执行的信号。

2 个答案:

答案 0 :(得分:1)

执行此操作的方法有很多。但是通常在创建生产(或登台或开发)服务器时,会设置环境变量。并根据该环境变量动态决定要加载的设置文件。

想象一下在Django设置文件中的类似内容:

import os

ENVIRONMENT = os.environ.get('ENVIRONMENT', 'development')

然后您可以使用

from django.conf import settings

if settings.ENVIRONMENT == 'production':
    # do something only on production

答案 1 :(得分:0)

自那时以来,我没有一个令人信服的答案,尽管不是100%干净,但我设法提出了解决方案。我以为我会分享最终得到的解决方案。

import sys
from django.conf import settings

if (settings.DEBUG and 'runserver' in sys.argv) or not settings.DEBUG:
     """your code to run only in development and production"""

基本原理是,无论是否处于调试模式,您都可以运行代码。但是,如果它处于DEBUG模式,请检查进程执行中的参数中是否有runserver。