Django-Q踩坑总结

  • 如果你的代码需要打包成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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值