嗨,我想启动一个后台线程,它在我的应用程序第一次运行时运行。我已经使用应用程序配置的ready()
函数实现了它。
class MyappConfig(AppConfig):
name = 'myApp'
def ready(self):
try:
thread = threading.Thread(target=xxxx)
except:
pass
问题是,当Django运行它的迁移时,这个方法也会被调用,但它不应该这样做。我如何才能防止这种情况的发生。
我尝试过使用Django后台任务,但它根本不会运行任务
发布于 2016-06-20 08:24:19
如果使用python manage.py migrate调用脚本,则可以避免执行代码:
import sys
if not 'manage.py' in sys.argv:
....
发布于 2020-08-09 13:09:12
我发现最好的方法是检查runserver
是否在sys.argv
中
from django.apps import AppConfig
import sys
class config(AppConfig):
name = 'appName'
if 'runserver' in sys.argv:
do_main_thread()
这比manage.py
工作得更好,因为在我用于migrate
、makemigrations
和runserver
的每个命令中都有这个参数。
发布于 2021-08-25 21:20:32
准备了我的版本如何避免在Django应用程序启动时在后台启动自定义线程。
例如,如果您正在设置webhooks或推送另一个服务。并希望在迁移或任何其他命令期间避免这种情况,除了manage.py runserver
和使用gunicorn
启动web服务器之外。
import logging
import sys
from django.apps import AppConfig
logger = logging.getLogger(__name__)
class config(AppConfig):
def ready(self):
if not sys.argv[0].endswith('gunicorn') and \
sys.argv[0].endswith('manage.py') and 'runserver' not in sys.argv:
logger.debug('Not starting extra threads here.')
return
do_start_new_threads()
https://stackoverflow.com/questions/37916077
复制相似问题