当前位置: 首页 > news >正文

Django-------自定义命令

每次在启动Django服务之前,我们都会在终端运行python manage.py xxx的管理命令。其实我们还可以自定义管理命令,这对于执行独立的脚本或任务非常有用,比如清除缓存、导出用户邮件清单或发送邮件等等。

自定义的管理命令不仅可以通过manage.py运行,还可以通过Linux或Celery的crontab服务将其设成定时任务。本文主要讲解如何自定义Django-admin命令,并提供一些演示案例。

 自定义Django-admin命令一共分三步:创建文件夹布局、编写命令代码和测试使用。

 1.创建文件夹布局

自定义的Django-admin管理命令本质上是一个python脚本文件,它的存放路径必须遵循一定的规范,一般位于app/management/commands目录。整个文件夹的布局如下所示:

 app01/__init__.pymodels.pymanagement/          #在app下创建management包__init__.pycommands/         #在management包下创建commands包__init__.py_private.py # 以下划线开头文件不能用作管理命令my_commands.py # 这个就是自定义的管理命令脚本,文件名即为命令名tests.pyviews.py

 

注意:

  • management和commands每个目录下都必须有个__init__.py空文件,表明这是一个python包。另外以下划线开头的文件名不能用作管理命令脚本。
  • management/commands目录可以位于任何一个app的目录下,Django都能找到它。
  • 一般建议每个python脚本文件对应一条管理命令。

 2.编写命令代码

每一个自定义的管理命令本质是一个Command类, 它继承了Django的Basecommand或其子类, 主要通过重写handle()方法实现自己的业务逻辑代码,而add_arguments()则用于帮助处理命令行的参数,如果运行命令时不需要额外参数,可以不写这个方法。

 from django.core.management.base import BaseCommandclass Command(BaseCommand):# 帮助文本, 一般备注命令的用途及如何使用。help = 'Some help texts'# 处理命令行参数,可选def add_arguments(self, parser):pass# 核心业务逻辑def handle(self, *args, **options):pass

实际应用场景

        案例1:检查数据库连接是否已就绪

无论你使用常规方式还是Docker在生产环境中部署Django项目,你需要确保数据库连接已就绪后才进行数据库迁移(migrate)的命令(Docker-compose的depends选项并不能确保这点),否则Django应用程序会出现报错。

这时你可以自定义一个wait_for_db的命令,如下所示:

 # app/management/commands/wait_for_db.pyimport timefrom django.db import connectionsfrom django.db.utils import OperationalErrorfrom django.core.management import BaseCommandclass Command(BaseCommand):help = 'Run data migrations until db is available.'def handle(self, *args, **options):self.stdout.write('Waiting for database...')db_conn = Nonewhile not db_conn:try:# 尝试连接db_conn = connections['default']except OperationalError:# 连接失败,就等待1秒钟self.stdout.write('Database unavailable, waiting 1 second...')time.sleep(1)self.stdout.write(self.style.SUCCESS('Database available!'))

 命令: python manage.py wait_for_db

案例2:周期性发送邮件

http://www.lryc.cn/news/118186.html

相关文章:

  • 【Linux】在浏览器输入网址后发生了什么事情?
  • 推荐两本书《JavaRoadmap》、《JustCC》
  • 使用基于jvm-sandbox的对三层嵌套类型的改造
  • [HDLBits] Mt2015 q4b
  • C++:堆排序
  • Grafana Prometheus 通过JMX监控kafka
  • vue项目切换页面白屏不显示解决方案
  • Goland报错 : Try to open it externally to fix format problem
  • Python-OpenCV中的图像处理-几何变换
  • 前端JavaScript入门-day08-正则表达式
  • ML类CFAR检测器在不同环境中检测性能的分析
  • element-ui 路由动态加载功能
  • (学习笔记-进程管理)进程调度
  • 十分钟python入门 正则表达式
  • 关于数据拷贝赋值方法
  • Effective Java笔记(32)谨慎并用泛型和可变参数
  • 数据结构——双向链表
  • Declare 关键字在 TypeScript 中如何正确使用?
  • ChatGPT将会成为强者的外挂?—— 提高学习能力
  • AUTOSAR规范与ECU软件开发(基础篇)1.3 车用控制器软件标准(从OSEK到AUTOSAR)
  • R语言5_安装Giotto
  • centos按用户保存历史执行命令
  • 【力扣】61. 旋转链表 <快慢指针>
  • 编写一个指令(v-focus2end)使输入框文本在聚焦时焦点在文本最后一个位置
  • Virtualbox设置访问外网以及主机和虚拟机互通
  • 请简述React是什么?React的主要特点有哪些?React中有哪些主要组件?
  • DevOps最佳实践和工具在本地环境中的概述
  • kafka和rabbitmq之间的区别以及适用场景
  • python——案例15:判断奇数还是偶数
  • springboot汽车租赁后台java出租客户管理jsp源代码mysql