我只需要在开发或生产环境中执行一些内务处理代码。不幸的是,所有管理命令的执行都类似于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等管理命令执行的信号。
答案 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。