我想在Django服务器启动时执行一些代码,但我希望它只运行一次。目前,当我启动服务器时,它会被执行两次。文档说,这种情况可能会发生,而且:
您应该在您的AppConfig类上放置一个标志,以防止重新运行的代码,该代码应该只执行一次。
知道如何做到这一点吗?下面的Print语句仍然执行两次。
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")
发布于 2018-01-04 11:40:18
使用python manage.py runserver
Django启动两个进程,一个用于实际的开发服务器,另一个用于在代码更改时重新加载应用程序。
您还可以在不使用reload选项的情况下启动服务器,并且只会看到一个正在运行的进程只执行一次:
python manage.py runserver --noreload
发布于 2018-09-20 17:46:45
如果不想使用--noreload
,可以:
替换应用程序__init__.py
中用于指定配置的行:
default_app_config = 'mydjangoapp.apps.MydjangoappConfig'
通过这一点:
import os
if os.environ.get('RUN_MAIN', None) != 'true':
default_app_config = 'mydjangoapp.apps.MydjangoappConfig'
或者,在您的RUN_MAIN
ready
方法中检查ready
环境变量:
import os
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'app'
def ready(self):
if os.environ.get('RUN_MAIN'):
print('Hello')
发布于 2021-06-14 16:17:21
我发现这对我来说是有效的,没有使用在python manage.py runserver
中使用--noreload
标志。
检查环境变量中的ready()
方法。env变量在应用程序结束后不会持久化,但如果服务器检测到代码更改并自动重新加载它自己,则会持久化。
# 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
https://stackoverflow.com/questions/33814615
复制相似问题