扩展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.py 的各种功能

官方文档 【简介】 django-admin.py是Django的一个用于管理任务的命令行工具。本文将描述它的大概用法。 另外,在每一个Django project中都会...
  • cyrabbit
  • cyrabbit
  • 2012年05月16日 22:42
  • 9045

【Django2.0】python manage.py makemigrations 和 python manage.py migrate的区别

无论当我们第一次在models.py中创建类对象还是对类中的属性进行修改,我们都会使用python manage.py makemigrations 和 python manage.py migrat...
  • hpu_yly_bj
  • hpu_yly_bj
  • 2017年12月29日 10:03
  • 308

【Django】Django命令(Manager.py)

django-admin.py startproject mysite 该命令在当前目录创建一个 mysite 目录。django-admin.py这个文件在C:\Python27\Lib\site-...
  • feng88724
  • feng88724
  • 2012年02月11日 23:47
  • 18038

django manage.py扩展自定义命令

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

编写Django自定义manage命令

manage.py是在我们创建Django项目的时候就自动生成在根目录下的一个命令行工具,它可以执行一些简单的命令,其功能是将Django project放到sys.path目录中,同时设置DJANG...
  • lion19930924
  • lion19930924
  • 2016年07月13日 20:28
  • 1229

使用django-admin.py创建Django项目没有生成manage.py文件等问题

1、自己写manage.py文件 #!/usr/bin/env python import os import sys if __name__ == "__main__": os.envi...
  • xu3737284
  • xu3737284
  • 2016年10月16日 11:11
  • 2336

如何使用Django 启动命令行及执行脚本

使用django启动命令行和脚本,可以方便的使用django框架做开发,例如,数据库的操作等。 django shell的启动启动命令:$/data/python-virtualenv/apple/b...
  • lanyang123456
  • lanyang123456
  • 2017年11月26日 11:44
  • 487

Django Manager

Django ManagerDjango之中会为每一个定义的model生成一个Manager,其默认名称就是objects,所以一般情况下对model进行处理都是通过model.objects.XXX...
  • sicofield
  • sicofield
  • 2015年10月20日 21:55
  • 2127

django&python&linux后台运行

在后台运行 django: nohup python manage.py runserver 0.0.0.0:9000 & ps:&可以不写 查看后台某个进程: ps -ef|grep "...
  • woshizoe
  • woshizoe
  • 2014年05月04日 17:05
  • 3913

Django1.6 运行manage.py 报错解决办法(ImportError)

如题,django项目中运行manage.py python manage.py runserver 出现如下错误提示 Traceback (most recent call last):   Fi...
  • echoyjj
  • echoyjj
  • 2013年12月13日 22:46
  • 18003
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扩展Django:实现自己的manage命令
举报原因:
原因补充:

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