django manage.py 的各种功能
【简介】
django-admin.py是Django的一个用于管理任务的命令行工具。本文将描述它的大概用法。
另外,在每一个Django project中都会有一个manage.py。manage.py是对django-admin.py的简单包装,它额外帮助我们做了两件事情:
它将你的project的包放到sys.path中
它将DJANGO_SETTINGS_MODULE环境变量设置为了你的project的setting.py文件的位置。
如果你是通过setup.py工具来安装Django的,那么django-admin.py脚本应该在你的系统目录中。如果不存在,你可以到你的python安装目录下的site-package/django/bin中去找找看。
通常来说,如果你经常是在一个独立的Django project里工作,那么使用manage.py会更方便一些。但如果你有很多Django
project,那么可以使用django-admin.py,同时需要经常变更DJANGO_SETTINGS_MODULE或使用–settings选项来设置不同的setting.py。
本文中都会使用django-admin.py来给大家做演示,但所有的例子,都也可以使用manage.py来实现。
【用法】
djang-admin.py的语法为:
1
2
|
django-admin.py <subcommand> [options] manage.py <subcommand> [options] |
其中,subcommand是子命令;options是可选的,可以有0个到多个option。
获得帮助的方法是使用help这个命令,共有两种方法:
1 运行django-admin.py help会显示用法信息,并给出所有可用的subcommand列表
2 运行django-admin.py help <subcommand>会显示特定的subcommand的描述信息,以及所有可用的options
运行django-admin.py –version可以显示django的版本号。
如果使用django-admin.py时加入–verbosity,则会显示大量通知信息和调试信息。
【startproject】- subcommand
In Django, Projects can have many apps. Apps can be shared among many projects.
在当前目录或指定位置创建一个Django project文件夹结构。
默认情况下,新文件夹中会包括manage.py和一系列必备文件。
目标位置参数是可选的参数,可以设置project所创建的路径。
例如,如下命令可以在指定位置创建一个project:
1
|
django-admin.py startproject myproject /Users/jezdez/Code/myproject_repo |
和startapp命令一样,--template命令准许你指定一个文件夹,文件路径,或者一个自定义项目模板的链接,关于对项目模板的支持可以查看startapp的文档
下面的例子,在创建myproject项目的时候,会在指定的路径查找模板
1
|
django-admin.py startproject --template= /users/jezdez/code/my_project_template myproject |
When Django copies the project template files, it also renders certain files through the template engine: the files whose extensions match the --extension option (py by default) and the files whose names are passed with the --name option. The template context used is:
Any option passed to the startproject command
project_name -- the project name as passed to the command
project_directory -- the full path of the newly created project
secret_key -- a random key for the SECRET_KEY setting
Please also see the rendering warning as mentioned for startapp.
【startapp】- subcommand
在当前路径或指定目录下创建一个Django app的文件夹结构。
默认情况下,文件夹中会包括module.py文件和其他必备文件。
如下命令用于在特定目录下创建一个app:
1
|
django-admin.py startapp myapp /Users/jezdez/Code/myapp |
【shell】- subcommand
用于开启一个Python解释器。
Django默认会使用IPython或bpython。但如果你没有安装它们或者就是要使用简装版的话,可以加上–plain选项,即:
1
|
django-admin.py shell --plain |
【runserver】- subcommand
用于在本机启动一个轻量级的Web server。默认情况下,这个server会在127.0.0.1上监听8000端口。你也可以传入参数来改变默认配置。
如果你并非特权用户,那么你所设置的端口号不能低于1024,因为小于1024的端口已经被系统预定了。
一定不要用这个轻量级Server作为你的生产环境下的Server,因为它只能用于开发自测阶段。它既没有安全审计功能,而且又是单线程的。
另外,每来一个请求,Web Server都会从新载入一遍Python代码,因此如果你的代码有改动,不需要重启Web Server即可生效。
你可以在一个project中启动多个fastcgi server,只要设置不同的端口就可以了。
如果你设定的IP为默认的127.0.0.1,那么你只能从本机的浏览器来登录浏览,无法从其他机器来访问。为了能让其他机器浏览本机,需要将IP设置为目标机器的IP或者0.0.0.0(IPv4地址)或::(IPv6地址)。
在指定IP地址时,也可以使用主机名或域名来代替。
【syncdb】- subcommand
1
|
django-admin.py syncdb |
这个命令将为以安装的(INSTALLED_APPS)apps创建数据表,如果数据表还没创建的话。
【runfcgi】- subcommand
用于启动一个支持FastCGI协议的进程,以便接收WebServer发来的请求。可以使用flup作为Python FastCGI模块。
runfcgi的选项如下:
- protocol:用于设定所使用的cgi协议,包括fcgi、scgi和ajp等,默认是fcgi。
- host:用于设置监听所在的主机名
- port:用于设定监听的端口
- socket:用于设置监听的UNIX socket
- method:可以设置为prefork或threaded。默认是prefork。
- maxrequests:一个子进程所能处理的请求的最大数量。一旦超过此数量,则子进程会被kill掉,并创建一个新进程。设置为0意味着对子进程无限制。
- maxspare:空闲进程/线程的最大数量
- minspare:空闲进程/线程的最小数量
- maxchildren:进程/线程数的硬限制值
- daemonize:为boolean值,表示是否放到后台运行。
- pidfile:设置一个文件,用于将产生的PID信息写入。
- workdir:用于设置工作目录
- debug:为boolean值,用于设置是否开启flup的信息跟踪
- outlog:用于设置将标准输出写入到的文件
- errlog:用于设置将标准错误输出写入到的文件
- umask:用于设置在进程运行时所用的umask。默认是022.
举例来说:
1
2
|
django-admin.py runfcgi socket= /tmp/fcgi .sock method=prefork daemonize= true \ pidfile= /var/run/django-fcgi .pid |
此命令用于在后台启动fastCGI,并将pid写入文件中。
【扩展manage命令】
我们都用过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来执行命令:
1
2
3
4
5
|
#!/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函数发现"管理模块":
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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文件的名称匹配到命令名称:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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类:
1
2
3
4
5
6
7
8
|
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文件:
1
2
3
4
5
6
7
8
|
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命令了:
1
2
|
$ python manage.py hello hello, django! |
django manage.py 的各种功能的更多相关文章
- Python Django manage.py提供的命令及用法
λpython manage.pyType'manage.py help <subcommand>'for help on a specific subcommand. Available ...
- Django manage.py 命令详解
manage.py 查看命令的作用的语句 C:\Users\Administrator> python manage.py help Type 'manage.py help <subco ...
- 【Django】如何自定义manage.py命令? 达到启动后台进程的目的?
代码: #-*- coding:utf- -*- """ The handle active user mail send """ from ...
- Django学习之三:django-admin 和 项目manage.py程序
目录 Django django-admin 和 项目manage.py程序 它俩是什么? 命令程序用法 常用命令 Django django-admin 和 项目manage.py程序 它俩是什么? ...
- Django编写自定义manage.py 命令
官网文档地址:编写自定义 django-admin 命令 金句: 你所浪费的今天,正是昨天死的人所期待的明天. 开篇话: python manage.py <command> 的命令我们用 ...
- django 1.7之后python manage.py syncdb没有了
在命令行输入python manage.py createsuperuser按照提示输入即可记得先初始化表. django>1.7 python manage.py makemigrations ...
- Django学习之manage.py使用
1.django-admin.py startproject mysite 开始一个项目,会初始化一些项目的结构文件 2.python manage.py runserver ip:port 如: p ...
- Django笔记 manage.py脚本的使用
1. 管理Django项目 python manage.py startproject projectname # 新建Django project ~~projectname是自己的项目名称 pyt ...
- django源码分析 python manage.py runserver
django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I be ...
随机推荐
- 利用MARQUEE实现正在处理效果
ASP.NET服务器端事件利用MARQUEE实现正在处理效果 前言:ASP.NET同仁们应该都遇到过当触发一个比较耗时的服务器端事件时,页面会处在一个等待的状态(即假死状态),用户体验非常不好,很 ...
- ASP.NET服务器端事件利用MARQUEE实现正在处理效果
前言:ASP.NET同仁们应该都遇到过当触发一个比较耗时的服务器端事件时,页面会处在一个等待的状态(即假死状态),用户体验非常不好,很容易造成用户二次点击,造成重复提交.至于解决方案自然是有的(问go ...
- facebook .net sdk 应用
浅谈 facebook .net sdk 应用 今天看了一篇非常好的文章,就放在这里与大家分享一下,顺便也给自己留一份.这段时间一直在学习MVC,另外如果大家有什么好的建议或者学习的地方,也请告知 ...
- spring mvc在普通类中获取HttpServletRequest对象
如题,需要在web.xml中配置request监听,如下 <listener> <description>spring request监听器</description&g ...
- Python 用POP接收邮件
一.简介 POP(Post Office Protocal)最长用的POP版本是POP3,因此本文是以POP3为主.POP3非常简单,可以用来从邮件服务器上下载邮件,然后删除这些邮件.功能非常有限,后 ...
- 解决phpmailer可以在windows下面发送成功, 在linux下面失败的问题
谢天谢地...差点因为在linux下面phpmailer发送邮件失败转到了window+IIS... Godaddy的linux服务器无法用phpmailer发送(我用的是网易的邮箱服务器...虽然现 ...
- Chrome浏览器网页截全屏算法以及实现
做个一个简单的批量下载插件叫“挖一下”, 正如插件的名字一样,采集网页里面的所有图片,根据筛选条件过滤不需要的图片,最后下载选中的图片. 索性把网页也一起给截了,截屏分两种: 1.可见内容截屏 2.完 ...
- 【Win32API】SendInput ERROR_BUSY 错误原因
最近需要解决一个Windows上模拟键盘输入的问题, 使用SendInput这个API来实现的.当我从另外一台机器给当前机器发送一条键盘指令时,发现SendInput一直是成功的,但是没有看到任何输入 ...
- 杨辉三角形II(Pascal's Triangle II)
杨辉三角形II(Pascal's Triangle II) 问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O( ...
- 【Linux】CentOS 学习笔记之二(命令)
打开文件夹: cd finename 创建目录:mkdir /filename mkdir -p /test/123/111 (多级目录) 删除目录: rmdir 删除目录或文件: r ...