哪个网站做视频挣钱,住建局建设工程质量监督站,外链免费发布平台,太原制作响应式网站每次在启动Django服务之前#xff0c;我们都会在终端运行python manage.py xxx的管理命令。其实我们还可以自定义管理命令#xff0c;这对于执行独立的脚本或任务非常有用#xff0c;比如清除缓存、导出用户邮件清单或发送邮件等等。
自定义的管理命令不仅可以通过manage.p…每次在启动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周期性发送邮件