- 如果你的代码需要打包成exe或者在windows环境下运行,请在manage.py的main函数加上
详细可以自行搜索相关资料。
freeze_support()
- 如果你的项目使用了一些脚本,例如定时器等脚本需要在程序启动前运行,并且同时使用了Django-Q,那么你需要使脚本在Django-Q启动之前运行。通常我们都是在app下的ready()方法中编写脚本内容,但是此处不能,因为Django-Q会创建多个进程,导致脚本被多次执行,你可以在manage.py的main()函数执行脚本,如果你的脚本使用了模型,请使用django.setup()方法。以下是一个示例,我总共执行了3个脚本。
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
from multiprocessing import freeze_support
def base_init():
"""使用了Django-Q后不能在app中的ready方法编写脚本,会导致被多次执行,在此处提前执行初始化、定时器、同步等内容"""
import django
django.setup() # 使该脚本能够使用django的环境
# 1. 初始化数据
from example_a import initialize_data
from example_b import synchronize_data
# 初始化数据
initialize_data()
# 同步数据
synchronize_data()
# 2.定时器
from scheduler.schedule_task import scheduler
# 3.Django-Q
from django_q.cluster import Cluster
q = Cluster()
q.start()
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'energy_consumption_calc.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
# 启动前需要执行的内容
base_init()
# 执行输入命令
execute_from_command_line(sys.argv)
if __name__ == '__main__':
freeze_support()
main()