在django項目中自定義manage命令(轉)


add by zhj 是我增加的注釋

原文: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 文件。(add by zhj 如果只有一個django project,那用manage.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文件,目錄結構為(add by zhj)

app_name
├── __init__.py ├── management │   ├── commands │   │   ├── __init__.py │   │   └── hello.py │   └── __init__.py ├── models.py ├── tests.py └── views.py

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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM