Django-Commands

2017-09-02 23:59:07
my site
code.

. command 位置

Django 对于命令的添加有一套规范,你可以为每个app 指定命令,对于代码的放置位置他有规定的方式(当然你可以hack 源码)

  1. 假如你新建了一个app 名字为demo

  2. 在demo 下新建一个python package 名称必须为management,

  3. 在management 新建command 文件夹,

  4. 在command 下你就可以构建自己的命令代码

  5. 当以上工作完成是你的文件夹结构应该是: app/management/management/

.源码解析

位置: core/management/__init__.py

在这个文件中定义了加载命令的顺序以及方式


def find_commands(management_dir: "Users/fiz/Documents/py/demo/mycommand/management"):
    """
    Given a path to a management directory, return a list of all the command
    names that are available.
    """
    # 并在该文件下面查找commands 的路径
    command_dir = os.path.join(management_dir, 'commands')
    #循环遍历读取文件下的Command
    return [name for _, name, is_pkg in pkgutil.iter_modules([command_dir])
            if not is_pkg and not name.startswith('_')]
@functools.lru_cache(maxsize=None)
def get_commands():
    # 加载所有内置的模块定义的command
    commands = {name: 'django.core' for name in find_commands(__path__[0])}

    if not settings.configured:
        return commands
    # 循环读取添加在install-app下的app 并查找commands的定义
    for app_config in reversed(list(apps.get_app_configs())):
        # 在当前路径下寻找management文件夹
        path = os.path.join(app_config.path, 'management')
        commands.update({name: app_config.name for name in find_commands(path)})

    return commands

示范代码

  1. 我们添加一个为备份数据库的命令,运行这个命令可以dump 数据库到指定的文件中(类似mysqldump)

# -*- coding:utf-8 -*-
"""FIZ 17/9/2 """
import subprocess

from django.core.management.base import BaseCommand
from django.conf import settings


class Command(BaseCommand):
    """dump the database for backup"""
    help = ("dump the database for backup"
            "the deault db name is setting`s db name")
    requires_migrations_checks = True
    requires_system_checks = True

    def add_arguments(self, parser):
        parser.add_argument(
            '--database', action='store', dest='database', default=settings.DATABASES.get('default')
                .get('NAME'),
            help='provider a database for dump.',
        )
        parser.add_argument(
            '--file_name', action="store", dest="file_name", default='back.sql',
            help='save the db file'
        )

    def handle(self, *args, **options):
        database = options['database']
        print(database)
        file_name = options['file_name']
        pwd = settings.DATABASES.get('default').get("PASSWORD")
        try:

            subprocess.run(args=("mysqldump -u root -p{pwd}  {database}  ".format(
                database=database, pwd=pwd)),
                stdout=open(file_name, 'w+'),
                shell=True,
                check=True)
        except (Exception, EOFError) as info:
            print(info)

结果

Mou icon

Mou icon

Mou icon

:听着李志的热河,蛮不错

如果年轻时你没来过热河路,

那你现在的生活是不是很幸福

纪念碑旁有一家破旧的电影院,

往北走五百米就是南京火车西站


FIZLIN
514 声望8 粉丝

跟我走吧,天亮就出发


引用和评论

0 条评论