首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免AppConfig.ready()方法在Django中运行两次

如何避免AppConfig.ready()方法在Django中运行两次
EN

Stack Overflow用户
提问于 2015-11-19 21:23:13
回答 6查看 15.4K关注 0票数 71

我想在Django服务器启动时执行一些代码,但我希望它只运行一次。目前,当我启动服务器时,它会被执行两次。文档说,这种情况可能会发生,而且:

您应该在您的AppConfig类上放置一个标志,以防止重新运行的代码,该代码应该只执行一次。

知道如何做到这一点吗?下面的Print语句仍然执行两次。

代码语言:javascript
运行
复制
from django.apps import AppConfig
import app.mqtt
from apscheduler.schedulers.background import BackgroundScheduler

class MyAppConfig(AppConfig):
    name = 'app'
    verbose_name = "HomeIoT"
    run_already = False

    def ready(self):
        if MyAppConfig.run_already: return
        MyAppConfig.run_already = True
        print("Hello")
EN

回答 6

Stack Overflow用户

发布于 2018-01-04 11:40:18

使用python manage.py runserver Django启动两个进程,一个用于实际的开发服务器,另一个用于在代码更改时重新加载应用程序。

您还可以在不使用reload选项的情况下启动服务器,并且只会看到一个正在运行的进程只执行一次:

代码语言:javascript
运行
复制
python manage.py runserver --noreload

方法在Django中运行两次

票数 52
EN

Stack Overflow用户

发布于 2018-09-20 17:46:45

如果不想使用--noreload,可以:

替换应用程序__init__.py中用于指定配置的行:

代码语言:javascript
运行
复制
default_app_config = 'mydjangoapp.apps.MydjangoappConfig'

通过这一点:

代码语言:javascript
运行
复制
import os

if os.environ.get('RUN_MAIN', None) != 'true':
    default_app_config = 'mydjangoapp.apps.MydjangoappConfig'

或者,在您的RUN_MAIN ready方法中检查ready环境变量:

代码语言:javascript
运行
复制
import os

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'app'

    def ready(self):
        if os.environ.get('RUN_MAIN'):
            print('Hello')
票数 33
EN

Stack Overflow用户

发布于 2021-06-14 16:17:21

我发现这对我来说是有效的,没有使用python manage.py runserver中使用--noreload标志。

检查环境变量中的ready()方法。env变量在应用程序结束后不会持久化,但如果服务器检测到代码更改并自动重新加载它自己,则会持久化。

代码语言:javascript
运行
复制
# File located in mysite/apps.py

from django.apps import AppConfig
import os

class CommandLineRunner(AppConfig):
    name = 'mysite'

    def ready(self):
        run_once = os.environ.get('CMDLINERUNNER_RUN_ONCE') 
        if run_once is not None:
            return
        os.environ['CMDLINERUNNER_RUN_ONCE'] = 'True' 

        # The code you want to run ONCE here
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33814615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档