Django自定义manage.py shell命令及案例

2024-04-0409:58:57后端程序开发Comments602 views字数 3264阅读模式

启动Django服务之前,都会在终端运行python manage.py xxx的管理命令。其实还可以自定义管理命令,比如系统初始化、清除缓存、导出用户邮件清单或发送邮件等等。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

创建文件夹布局文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

management和commands每个目录下都必须有个__init__.py空文件,表明这是一个python包。另外以下划线开头的文件名不能用作管理命令脚本。management/commands目录可以位于任何一个app的目录下,Django都能找到它。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

自定义的Django-admin管理命令本质上是一个python脚本文件,它的存放路径必须遵循一定的规范,一般位于app/management/commands目录。整个文件夹的布局如下所示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

app/  __init__.py  models.py  management/    __init__.py    commands/    __init__.py    _private.py # 以下划线开头文件不能用作管理命令    init.py # 这个就是自定义的管理命令脚本,文件名即为命令名    tests.py  views.py

编写命令代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

定义结构文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

每一个自定义的管理命令本质是一个Command类, 它继承了Django的Basecommand或其子类, 主要通过重写handle()方法实现自己的业务逻辑代码,而add_arguments()则用于帮助处理命令行的参数,如果运行命令时不需要额外参数,可以不写这个方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

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

定义一个名为show_version的命令。当运行python manage.py show_version命令时,控制台会打印出提示和版本信息。在drf_pro/management/commands目录下新建show_version.py, 添加如下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

import sysfrom django.core.management.base import BaseCommand class Command(BaseCommand):    """    执行指令:python manage.py show_version    显示帮助信息 python manage.py show_version -h    输入库名称,显示库的帮助信息 python manage.py show_version sys    """    # 帮助信息 用于备注命令的用途及如何使用    help = f"帮助信息"     # 可选    def add_arguments(self, parser):pass     # 业务逻辑    def handle(self, *args, **options):        self.stdout.write(f"{self.help},当前系统环境版本:{sys.version}")        self.stdout.write("this is django custom command line")

添加参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

通过命令行给show_version命令传递一个name参数,以实现运行python manage.py show_version命令时 打印出对应库的信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

修改show_version.py, 添加add_arguments方法,该方法的作用是给自定义的handle方法添加1个或多个参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

import sysfrom importlib import import_modulefrom django.core.management.base import BaseCommand # class CommandHello(BaseCommand): # error 错误的命名class Command(BaseCommand):    """    执行指令:python manage.py show_version    显示帮助信息 python manage.py show_version -h    输入库名称,显示库的帮助信息 python manage.py show_version sys    """    # 帮助信息 用于备注命令的用途及如何使用    help = f"当前系统环境版本:{sys.version}"     # 可选    def add_arguments(self, parser):        # 给命令添加一个名为name的参数        parser.add_argument('name')     # 业务逻辑 通过options字典接收name参数值    def handle(self, *args, **options):        self.stdout.write(f"{self.help}")        self.stdout.write("this is django custom command line")        help(import_module(options.get("name")))

再次运行python manage.py show_version os命令时,将得到如下输出结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

Django自定义manage.py shell命令及案例文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

如果直接运行命令而不携带参数,将会报错,如下所示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

Django自定义manage.py shell命令及案例文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

案例:初始化系统参数

定义一个init的系统参数初始化脚本,将静态文件的信息全部录入到数据库中。static/files/sys_config.json的文件内容格式如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

Django自定义manage.py shell命令及案例文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

定义init,py的命令文件,内容如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html

 # packages/drf_pro/management/commands/init.py import osimport jsonfrom django.conf import settingsfrom django.core.management.base import BaseCommandfrom packages.drf_pro.models import Config  class Command(BaseCommand):    help = "系统初始化配置"    tags = "[init conf]"     def add_arguments(self, parser):        pass     def handle(self, *args, **options):        self.stdout.write(f"{self.tags} start initializer config tbale...")         conf_file = os.path.join(settings.BASE_DIR, "static", "files", "sys_config.json").replace("\\","/")        if os.path.exists(conf_file):            with open(conf_file,encoding="utf-8") as conf_f:                configs = json.loads(conf_f.read())                 try:                    for conf in configs:                        is_exists = Config.objects.filter(name_en=conf["name_en"])                        if is_exists:                            conf_item = is_exists.first()                            conf_item.name_zh = conf.get("name_zh", "")                            conf_item.remark = conf.get("remark", "")                            conf_item.conf_type = conf.get("conf_type", "")                            conf_item.save()                        else:                            Config.objects.create(**conf)                    self.stdout.write(f"{self.tags} sync over.....")                except Exception as e:                    self.stderr.write(f"{self.tags} sync error, info:{e}")        else:            self.stderr.write(f"not exists:{conf_file}")
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62772.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/62772.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定