python command详解_Django -commands

Django-Commands

2017-09-02 23:59:07

my site

code.

. command 位置

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

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

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

在management 新建command 文件夹,

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

当以上工作完成是你的文件夹结构应该是: 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

示范代码

我们添加一个为备份数据库的命令,运行这个命令可以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)

结果

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值