29.Django自定义命令

栏目: Python · 发布时间: 5年前

内容简介:我们在使用Django的时候用到很多命令,比如启动服务器的自定义一个命令,输出创建一个测试项目,Cmds和应用customCMD,项目结构如下:

我们在使用Django的时候用到很多命令,比如启动服务器的 runserver 同步数据库的 migrate 等等这些都是 Django内置的,同时Django也提供了自定义命令的方法。

需求

自定义一个命令,输出 hello world

1.创建项目

创建一个测试项目,Cmds和应用customCMD,项目结构如下: 29.Django自定义命令

然后再在应用目录下创建一个management目录,该目录下在创建一个commands目录, 目录下创建一个 say.py 29.Django自定义命令

导入 from django.core.management.base import BaseCommand

# -*- coding:utf-8 -*-

from django.core.management.base import BaseCommand


# 必须继承BaseCommand
class Command(BaseCommand):

    # 重写handle方法
    def handle(self, *args, **options):
        print('hello world')

测试命令是否添加成功。

打开终端 python3 manage.py --help 29.Django自定义命令

我们发现自定义的命令 say 已经添加成功

[customCMD]
    say

接着我们测试一下这个命令 python3 manage.py say

$ python3 manage.py say
hello world

3.添加帮助说明

# -*- coding:utf-8 -*-

from django.core.management.base import BaseCommand


class Command(BaseCommand):

    # 添加帮助说明
    help = '此命令输入hello world'

    def handle(self, *args, **options):
        print('hello world')

然后输入 python3 manage.py say --help 29.Django自定义命令 已经有了帮助说明。

4.添加参数

在使用runserver命令的时候我们可以指定端口和地址,这是命令的参数,我们也可以给自己自定义的命令添加参数

from django.core.management.base import BaseCommand


class Command(BaseCommand):

    help = '此命令输入hello world'

    # 重写 注册参数
    def add_arguments(self, parser):
        parser.add_argument('word', type=str)

    def handle(self, *args, **options):
        # 获取参数
        print(options['word'])
python3 manage.py say 你好
你好

命令格式 python3 manage.py 自定义命令 <参数列表>

5.Django如何处理命令的

再项目跟目录有个 manage.py

def main():
    # 程序入口
    # 设置环境变量, 将setting.py中的设值配置好
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Cmds.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
    # 解析命令
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

execute_from_command_line()方法

def execute_from_command_line(argv=None):
    """Run a ManagementUtility."""
    utility = ManagementUtility(argv)
    utility.execute()

ManagementUtility()将解析参数,最终会执行到 get_commands()

@functools.lru_cache(maxsize=None)
def get_commands():

   # 查找命令
    commands = {name: 'django.core' for name in find_commands(__path__[0])}

    if not settings.configured:
        return commands

    for app_config in reversed(list(apps.get_app_configs())):
        # 查找每一个app目录下的management目录
        path = os.path.join(app_config.path, 'management')
        commands.update({name: app_config.name for name in find_commands(path)})

    return commands

find_commands()查找commands下的所有文件并且不能以下划线开头

def find_commands(management_dir):
    command_dir = os.path.join(management_dir, 'commands')
    return [name for _, name, is_pkg in pkgutil.iter_modules([command_dir])
            if not is_pkg and not name.startswith('_')]

这样命令就配置完成了。

load_command_class()加载命令

def load_command_class(app_name, name):

    module = import_module('%s.management.commands.%s' % (app_name, name))
    return module.Command()

以上所述就是小编给大家介绍的《29.Django自定义命令》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言深度解剖

C语言深度解剖

陈正冲 / 北京航空航天大学出版社 / 2010-7 / 29.00元

《C语言深度解剖:解开程序员面试笔试的秘密》由作者结合自身多年嵌入式c语言开发经验和平时讲解C语言的心得体会整理而成,其中有很多作者独特的见解或看法。由于并不是从头到尾讲解C语言的基础知识,所以《C语言深度解剖:解开程序员面试笔试的秘密》并不适用于C语言零基础的读者,其内容要比一般的C语言图书深得多、细致得多,其中有很多问题是各大公司的面试或笔试题。 《C语言深度解剖:解开程序员面试笔试的秘......一起来看看 《C语言深度解剖》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具