Django实现自定义的manage名利
来源:互联网 发布:java编程输入输出 编辑:程序博客网 时间:2024/04/29 19:50
我们都用过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文件。
excute_from_command_line()函数会根据命令行参数解析出命令的名称,根据命令名称调用相应的Command执行命令。Command位于各个管理模块的commands模块下面。
所谓管理模块,是指在app模块下的名字为management的模块。Django通过django.core.management.find_management_module函数发现"管理模块":
然后通过django.core.management.find_commands函数找到命令类。find_commands函数会在管理模块下查找.py文件,并将.py文件的名称匹配到命令名称:
在执行命令的时候,会执行相应Command类的handle方法。所有的Command类都应该是django.core.management.base.BaseCommand的直接或间接子类。
原理搞清楚了,扩展manage命令就很容易了。创建一个app并加入到settings的INSTALLED_APPS中,在该app下面创建management.commands模块,并创建hello.py文件:
就可以使用hello命令了:
django-admin.py调用django.core.management来执行命令:
#!/usr/bin/env pythonfrom 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, CommandErrorfrom django.db import models#from placeholders import *import os class Command(BaseCommand): def handle(self, *args, **options): print 'hello, django!'
就可以使用hello命令了:
$ python manage.py hellohello, django!
0 0
- Django实现自定义的manage名利
- 扩展Django:实现自己的manage命令
- 扩展Django:实现自己的manage命令
- 扩展Django:实现自己的manage命令
- 扩展Django:实现自己的manage命令
- 扩展Django:实现自己的manage命令
- 编写Django自定义manage命令
- Django 自定义manage.py 命令
- django manage.py扩展自定义命令
- django manage.py扩展自定义命令
- 【Django】如何自定义manage.py命令? 达到启动后台进程的目的?
- django manage.py 的各种功能
- django manage.py 的各种功能
- Django-manage.py
- Django-manage.py
- django 1.11 自定义分页功能的实现
- 名利诱惑的营销法
- Linux的名利未发现
- JavaScript的内部类和事件驱动
- 食品新闻接口文档及返回示例
- 系统登录
- beanstalkd高可用方案:keepalived+rsync
- 编程语言百科
- Django实现自定义的manage名利
- iOS 获取 当前设备 可用内存 及当前 应用 所占内存
- Linux动态库的工作原理详解
- java.net.SocketImpl
- HDU5492——合肥1009
- oracle sql 去重复记录不用distinct如何实现
- HTML5自适应:max-width和min-width
- Genero File Upload
- 怎么查看和修改 MySQL 的最大连接数