我需要执行一些内务代码,但只在开发或生产环境中。不幸的是,所有管理命令的执行方式都类似于runserver。是否有任何干净的方法来分类什么是执行环境和有选择地运行代码。
我在sys.argv中看到了一些解决方案,比如'runserver‘,但是它不适用于生产。看起来不太干净。django提供了什么来对正在执行的所有不同场景代码进行分类吗?
编辑
真正的问题是,一旦应用程序加载了一些经常被访问的数据,我们就需要初始化本地缓存。通常,我希望获取一些特定信息的DB并缓存它(当前在内存中)。问题是,当它试图获取DB时,可能不会创建表,实际上可能根本没有创建迁移文件。因此,当我运行makemigrations/迁移时,它将运行以下代码,尝试从DB获取,并抛出错误声明表不存在。但是,如果我不能运行table迁移/迁移,就不会有表,这是我想要避免的一个循环。这部分代码将为所有管理命令运行,但我想将它的执行限制在应用程序实际上是在服务请求时(即当需要缓存时),而不是针对任何管理命令(包括用户定义的命令)。
```javascript从django.apps导入AppConfig
从my_app.signals导入app_created
类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)发送应用程序创建的执行信号,而不是执行,因为管理命令,如制造,迁移等。
发布于 2018-12-21 12:02:42
做这件事有很多不同的方法。但是通常,当我创建一个生产(或分阶段,或开发)服务器时,我会设置一个环境变量。并根据该环境变量动态地决定要加载哪个设置文件。
想象一下Django设置文件中的如下内容:
import os
ENVIRONMENT = os.environ.get('ENVIRONMENT', 'development')然后你可以用
from django.conf import settings
if settings.ENVIRONMENT == 'production':
# do something only on production发布于 2019-01-11 10:50:38
因为,我没有得到一个令人信服的答案,我设法找到了一个解决办法,虽然不是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"""其基本原理是,如果代码不处于调试模式,则不管发生什么情况,都可以运行它。但是,如果处于调试模式,则检查进程执行是否在参数中包含runserver。
https://stackoverflow.com/questions/53884363
复制相似问题