扩展Django:实现自己的manage命令

转载 2016年08月31日 16:05:45

摘抄:http://www.cnblogs.com/holbrook/archive/2012/03/09/2387679.html    


我们都用过Django的django-admin.py和manage.py。django-admin.py是一个命令行工具,可以执行一些管理任务,比如创建Django项目。而manage.py是在创建每个Django project时自动添加在项目目录下的,只是对manage.py的一个简单包装,其功能是将Django project放到sys.path目录中,同时设置DJANGO_SETTINGS_MODULE环境变量为当前project的setting.py文件。


django-admin.py调用django.core.management来执行命令:

#!/usr/bin/env python
from django.core import management

if __name__ == "__main__":
management.execute_from_command_line()

excute_from_command_line()函数会根据命令行参数解析出命令的名称,根据命令名称调用相应的Command执行命令。Command位于各个管理模块的commands模块下面。

所谓管理模块,是指在app模块下的名字为management的模块。Django通过django.core.management.find_management_module函数发现"管理模块":

复制代码
django.core.management.find_management_module()
def find_management_module(app_name):
"""
Determines the path to the management module for the given app_name,
without actually importing the application or the management module.

Raises ImportError if the management module cannot be found for any reason.
"""
parts = app_name.split('.')
parts.append('management')
parts.reverse()
part = parts.pop()
path = None
复制代码


然后通过django.core.management.find_commands函数找到命令类。find_commands函数会在管理模块下查找.py文件,并将.py文件的名称匹配到命令名称:

复制代码
def find_commands(management_dir):
"""
Given a path to a management directory, returns a list of all the command
names that are available.

Returns an empty list if no commands are defined.
"""
command_dir = os.path.join(management_dir, 'commands')
try:
return [f[:-3] for f in os.listdir(command_dir)
if not f.startswith('_') and f.endswith('.py')]
except OSError:
return []
复制代码

最后,通过django.core.management.load_command_class函数加载该.py文件中的Command类:

复制代码
def load_command_class(app_name, name):
"""
Given a command name and an application name, returns the Command
class instance. All errors raised by the import process
(ImportError, AttributeError) are allowed to propagate.
"""
module = import_module('%s.management.commands.%s' % (app_name, name))
return module.Command()
复制代码

在执行命令的时候,会执行相应Command类的handle方法。所有的Command类都应该是django.core.management.base.BaseCommand的直接或间接子类。

原理搞清楚了,扩展manage命令就很容易了。创建一个app并加入到settings的INSTALLED_APPS中,在该app下面创建management.commands模块,并创建hello.py文件:

复制代码
from django.core.management.base import BaseCommand, CommandError
from django.db import models
#from placeholders import *
import os

class Command(BaseCommand):
def handle(self, *args, **options):
print 'hello, django!'
复制代码

就可以使用hello命令了:

$ python manage.py hello
hello, django!

本人已在github上用Jekyll建立了新的博客:http://thinkinside.tk/,本站文章会陆续迁移过去

相关文章推荐

扩展Django:实现自己的manage命令

我们都用过Django的django-admin.py和manage.py。django-admin.py是一个命令行工具,可以执行一些管理任务,比如创建Django项目。而manage.py是在创建...

django manage.py扩展自定义命令

# django manage.py扩展自定义命令 环境: mac django1.10.3 在实际的项目开发过程中,我们可能要执行某脚本初始化数据库,可能要启动多个服务,比如启动ce...

django(python manage.py imgrate)同步数据库出错后的解决办法

很多情况,因为app的models.py的文件内容有误,但是通过python   manage.py    check检查不出来时,当执行python   manage.py    imgrate同步...

运行django的manage.py runserver 8000时提示errno 10013的解决方法

首先上网查了下10013错误码是因为端口被占用导致,那么就要查看下端口目前占用...

django manage.py 的各种功能

官方文档 【简介】 django-admin.py是Django的一个用于管理任务的命令行工具。本文将描述它的大概用法。 另外,在每一个Django project中都会...

SAE如何线上执行Django的“manage.py syncdb”来同步数据库

声明:有些内容来自互联网,具体来源未知,我只是做些修改和解读。 在SAE想用Django的admin模块来管理Django,但需要先执行 manage.py syncdb命令,但官方文档的方法似乎不行...

Django学习之manage.py使用

1.django-admin.py startproject mysite 开始一个项目,会初始化一些项目的结构文件 2.python manage.py runserver ip:port 如:...

django-关于manage.py migrate无效的问题

migrate无效

nginx - cache manage process 过期缓存定期清理的实现

Nginx中缓存过期队列定时清理的实现,是通过event_timer红黑树来实现的。 相关数据结构先行:     struct ngx_even...

Django02-基本命令

Django 基本命令 « Django 环境搭建 Django 视图与网址 » 本节主要是为了让您了解一些django最基本的命令,请尝试着记住它们,并且多多练习下,特别是标记...
  • opera95
  • opera95
  • 2017年06月04日 12:13
  • 233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扩展Django:实现自己的manage命令
举报原因:
原因补充:

(最多只允许输入30个字)