django项目中使用crontab定时任务

django项目中使用crontab定时任务

django-crontab 在ubuntu-18.04.2上的使用
需求:django项目中需添加定时任务,定时执行某个函数或者自定义的命令等)

使用步骤

1. 安装django-crontab模块

	pip install django-crontab

2. 在settings.py文件中注册

INSTALLED_APPS = [
		...
    'django_crontab',
]

3. 在settings.py文件中配置

  • 定时执行自定义函数

    CRONJOBS = [
        # ('*/1 * * * *', 'app名.定时函数所在的py文件名.定时函数名', '>> 输出文件路径和名称')
        # 每1分钟执行restart_pm2函数,并将执行中的返回的内容全部打印到crontab.log文件中
        ('*/1 * * * *', 'app1.tasks.restart_pm2', '>>/home/wangzhipeng/myproject/crontab.log'),
    ]
    
  • 定时执行django中自定义的命令

    CRONJOBS = [
        # 每1分钟执行django的自定义命令,并将执行中的返回的内容全部打印到crontab.log文件中
        ('*/1 * * * *', 'django.core.management.call_command', ['mycommand1'], {"param": "mycommand1_test"}, '>>/home/wangzhipeng/myproject/crontab.log'),
        ('*/1 * * * *', 'django.core.management.call_command', ['mycommand2'], {"param": "mycommand2_test"}, '>>/home/wangzhipeng/myproject/crontab.log')
    ]
    

    格式:
    参数1:定时 例如*/1 * * * * 表示每隔1分钟执行
    参数2:方法的python模块路径,如果执行django-admin命令,则写django.core.management.call_command
    参数3:方法的位置参数列表(默认值:[]),如果执行django-admin命令,则填写所需执行的命令
    参数4:方法的关键字参数的dict(默认值:{})
    参数5:执行log存放位置(即重定向到文件,默认:‘’)

4. 创建定时执行的函数和命令

  • 4.1 在对应的应用下创建定时执行的函数(apps/app1/task.py文件中,添加is_restart_pm2()函数)

    def restart_pm2():
        from time import strftime, localtime
        print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')
        print("执行了restart_pm2函数")
    
    
  • 4.2 在对应的应用下创建定时执行的函数(创建apps/app1/management/commands文件,注意management与commands要引入 __init__py作为模块使用中,在commands下创建自定义的命令,如下图所示:)

    在这里插入图片描述
    在commands文件下创建两个命令文件:mycommand1.py,mycommand1.py,内容如下:
    mycommand1.py如下:

    from django.core.management.base import BaseCommand, CommandError
    from time import strftime, localtime
    	
    class Command(BaseCommand):
        help = '这是第一个command测试指令'
    
        # 为handle中添加参数解析,
        def add_arguments(self, parser):
            parser.add_argument(
                '-p', # 设置参数的时候  前边携带
                '--param',
                action='store',
                dest='param',  # 自定义传入的参数键名ss
                default='close',  # 默认的键值
                help='name of author.',
            )
    
        def handle(self, *args, **options):
            # print("mycommand1----开始")
            '''
            添加你需要功能,(访问数据库,判断有效性等等)
            ...
            '''
            # 例如
            try:
                if options['param']:
                    print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')
                    print(": mycommand1传入的参数为", options['param'])
            # except Exception as e:
            except Exception as e:
                print("12",e)
                print(CommandError("1111111111111111111111111"))
            # print("mycommand1----结束")
    

    mycommand2.py如下:

    from django.core.management.base import BaseCommand
    from time import strftime, localtime
    
    class Command(BaseCommand):
        help = '这是第二个command测试指令'
    
        # 为handle中添加参数解析,
        def add_arguments(self, parser):
            parser.add_argument(
                '-p', # 设置参数的时候  前边携带
                '--param',
                action='store',
                dest='param',  # 自定义传入的参数键名ss
                default='close',  # 默认的键值
                help='name of author.',
            )
    
        def handle(self, *args, **options):
            # print("mycommand2----开始")
            '''
            添加你需要功能,(访问数据库,判断有效性等等)
            ...
            '''
            # 例如
            if options['param']:
                print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')
                print("mycommand2传入的参数为", options['param'])
            # print("mycommand2----结束")
    
    
  • 4.3 测试自定义django命令
    输入:python3 manage.py mycommand1 -p 123
    输出:2019-05-10 15:10:59: mycommand1传入的参数为 123
    结果:ok,可以使用

5. 执行结果展示

添加并开启定时任务:python3 manage.py crontab add 结果如下:

  adding cronjob: (bf1cd50420be34c5385feba0ccbc8a2a) -> ('*/1 * * * *', 'app1.tasks.restart_pm2', '>>/home/wangzhipeng/myproject/crontab.log')
  adding cronjob: (3c1cf37daf3135751e741524b9b4da0b) -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand1'], {'param': 'mycommand1_test'}, '>>/home/wangzhipeng/myproject/crontab.log')
  adding cronjob: (d0d72e1cb25439aca55cbcddd5779427) -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand2'], {'param': 'mycommand2_test'}, '>>/home/wangzhipeng/myproject/crontab.log')

python环境查看定时任务:python3 manage.py crontab show 结果如下:

Currently active jobs in crontab:
bf1cd50420be34c5385feba0ccbc8a2a -> ('*/1 * * * *', 'app1.tasks.restart_pm2', '>>/home/wangzhipeng/myproject/crontab.log')
3c1cf37daf3135751e741524b9b4da0b -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand1'], {'param': 'mycommand1_test'}, '>>/home/wangzhipeng/myproject/crontab.log')
d0d72e1cb25439aca55cbcddd5779427 -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand2'], {'param': 'mycommand2_test'}, '>>/home/wangzhipeng/myproject/crontab.log')

在linux中(root下)查看定时i任务: crontab -l 结果如下:

*/1 * * * * /home/wangzhipeng/myproject/djangocelery/djangocelery/venv/bin/python3 /home/wangzhipeng/myproject/djangocelery/djangocelery/manage.py crontab run bf1cd50420be34c5385feba0ccbc8a2a >>/home/wangzhipeng/myproject/crontab.log # django-cronjobs for djangocelery
*/1 * * * * /home/wangzhipeng/myproject/djangocelery/djangocelery/venv/bin/python3 /home/wangzhipeng/myproject/djangocelery/djangocelery/manage.py crontab run 3c1cf37daf3135751e741524b9b4da0b >>/home/wangzhipeng/myproject/crontab.log # django-cronjobs for djangocelery
*/1 * * * * /home/wangzhipeng/myproject/djangocelery/djangocelery/venv/bin/python3 /home/wangzhipeng/myproject/djangocelery/djangocelery/manage.py crontab run d0d72e1cb25439aca55cbcddd5779427 >>/home/wangzhipeng/myproject/crontab.log # django-cronjobs for djangocelery

查看/home/wangzhipeng/myproject/crontab.log中的打印的信息:执行成功了
在这里插入图片描述

6. 操作命令

查看系统中已有的定时任务:

  • python3 manage.py crontab show

添加和修改定时任务:

  • python3 manage.py crontab add

删除定时任务:

  • python3 manage.py crontab remove

额外说明:

django-crontab只能基于linux环境中才能使用(本文都是在ubuntu的root下实现的,普通用户下有小问题,未解决

  • 提前查看linux上cron服务是否有启动
    查看status:service cron status
    开启服务: service cron start
  • 查看cron日志:cat /var/log/cron.log
    如果找不到日志文件,说明系统默认cron日志没有打开,可以参考下面给的文章
  • linux中查看定时任务:crontab -l
  • linux中添加定时任务:crontab -e

参考:

  1. https://blog.csdn.net/panyox/article/details/79157046
  2. https://blog.csdn.net/Fe_cow/article/details/83153932
  3. https://www.cnblogs.com/perfe/p/6198213.html
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 首先,需要在项目安装django-crontab库,在项目的settings.py文件配置INSTALLED_APPS并添加'django_crontab' 然后,在项目的根目录下新建一个cron.py文件,在文件编写定时任务代码 接着,在项目根目录下执行python manage.py crontab add 命令,将cron.py文件定时任务添加到crontab 最后,在项目根目录下执行python manage.py crontab show 命令,查看已添加的定时任务 例: 1.在项目的settings.py文件配置INSTALLED_APPS并添加'django_crontab' INSTALLED_APPS = [ ... 'django_crontab', ] 2.在项目根目录下新建一个cron.py文件,在文件编写定时任务代码 from django_crontab.app_settings import CRONJOBS @CRONJOBS.register() def my_cron_job(): print('This is a cron job') 3.在项目根目录下执行python manage.py crontab add 命令,将cron.py文件定时任务添加到crontab 4.在项目根目录下执行python manage.py crontab show 命令,查看已添加的定时任务 注意: - 具体的时间表达式可以参考crontab的语法 - django-crontab默认是后台运行的,如果想在前台运行需要手动设置 ### 回答2: 使用django-crontab可以很方便地在Django项目添加定时任务。下面是一个简单的示例: 首先,在项目的settings.py文件安装和配置django-crontab。在INSTALLED_APPS列表添加'django_crontab',然后在文件底部添加以下内容: ``` CRONJOBS = [ ('*/5 * * * *', 'myapp.tasks.my_task') ] ``` 这表示每5分钟执行一次名为my_task的定时任务。myapp是你的应用程序名称。接下来,我们需要创建一个任务函数,例如在myapp/tasks.py文件: ``` from django_crontab import CronJobBase, Schedule class MyTask(CronJobBase): RUN_EVERY_MINS = 5 schedule = Schedule(run_every_mins=RUN_EVERY_MINS) code = 'myapp.my_task' def do(self): # 这是你的任务逻辑,可以在这里执行任何操作 # 例如,发送邮件或者清理数据库等操作 print("执行定时任务") ``` 在这个例子,do()方法定义了实际的任务逻辑,我们在这里打印了一条消息。你可以根据实际需求在这里执行任何操作。 最后,在项目的根目录下运行命令`python manage.py crontab add`来启用定时任务。这样,定时任务将在每次运行Django项目时自动执行。 以上就是使用django-crontab编写一个简单的定时任务的步骤。通过配置CRONJOBS列表和定义任务函数,我们可以轻松地添加和管理定时任务。 ### 回答3: 要使用djangodjango-crontab库编写一个简单的定时任务,首先需要按照以下步骤进行设置: 1.将django-crontab库添加到你的django项目,可以通过在你的项目的requirements.txt文件添加"django-crontab"来实现。 2.在你的项目的settings.py文件,将'django_crontab'添加到INSTALLED_APPS列表。 3.在settings.py文件的最后,添加以下代码: ``` import os from django_crontab import CronTab CRONJOBS = [ ('*/15 * * * *', 'myapp.cron.my_cron_job', '>> /path/to/log/file.log') ] CRONTAB_COMMAND_SUFFIX = '2>&1' # Optional cron = CronTab() for (schedule, command, output) in CRONJOBS: job = cron.new(command=command, comment=command) job.setall(schedule) job.setall(output) cron.write() ``` 以上代码将创建一个定时任务,任务将每15分钟运行一次。"myapp.cron.my_cron_job"是你自己定义的任务函数,你可以在一个名为cron.py的模块创建这个函数,并在其定义具体的任务逻辑。 4.运行`python manage.py crontab add`命令,将任务添加到系统的crontab。 现在,你的简单定时任务已经设置完成。 注意:为了确保定时任务能够正常运行,你的项目需要在一个支持定时任务的环境运行,例如使用Celery或者是一个具有定时任务功能的主机。并且,要记得在服务器上启动定时任务服务。 希望这能够帮助你编写一个简单的定时任务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值