详解Python的Django框架中manage命令的使用与扩展

【简介】

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的语法为:

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,则会显示大量通知信息和调试信息。

【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.

举例来说:

django-admin.py runfcgi socket=/tmp/fcgi.sock method=prefork daemonize=true \
  pidfile=/var/run/django-fcgi.pid

此命令用于在后台启动fastCGI,并将pid写入文件中。

【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地址时,也可以使用主机名或域名来代替。

【shell】- subcommand

用于开启一个Python解释器。

Django默认会使用IPython或bpython。但如果你没有安装它们或者就是要使用简装版的话,可以加上–plain选项,即:

django-admin.py shell --plain

【startapp】- subcommand

在当前路径或指定目录下创建一个Django app的文件夹结构。

默认情况下,文件夹中会包括module.py文件和其他必备文件。

如下命令用于在特定目录下创建一个app:

django-admin.py startapp myapp /Users/jezdez/Code/myapp

【startproject】- subcommand

In Django, Projects can have many apps. Apps can be shared among many projects.

在当前目录或指定位置创建一个Django project文件夹结构。

默认情况下,新文件夹中会包括manage.py和一系列必备文件。

目标位置参数是可选的参数,可以设置project所创建的路径。

例如,如下命令可以在指定位置创建一个project:

django-admin.py startproject myproject /Users/jezdez/Code/myproject_repo

和startapp命令一样,--template命令准许你指定一个文件夹,文件路径,或者一个自定义项目模板的链接,关于对项目模板的支持可以查看startapp的文档

下面的例子,在创建myproject项目的时候,会在指定的路径查找模板

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.

syncdb

django-admin.py syncdb

这个命令将为以安装的(INSTALLED_APPS)apps创建数据表,如果数据表还没创建的话。

【扩展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来执行命令:

#!/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!
(0)

相关推荐

  • vc6编写python扩展的方法分享

    系统环境:VC6 + Python-2.5.4 1.下载Python-2.5.4源码. 2.解压,打开D:\Python-2.5.4\PC\VC6\pcbuild.dsw,编译,D:\Python-2.5.4\PC\VC6\下得到python25.dll.python25_d.dll.python25.lib.python25_d.lib. 3.使用VC6建立一个动态链接库工程,拷贝D:\Python-2.5.4\PC\example_nt\example.c到工程目录下,并添加到工程中. 4.

  • Python实现扩展内置类型的方法分析

    本文实例讲述了Python实现扩展内置类型的方法.分享给大家供大家参考,具体如下: 简介 除了实现新的类型的对象方式外,有时我们也可以通过扩展Python内置类型,从而支持其它类型的数据结构,比如为列表增加队列的插入和删除的方法.本文针对此问题,结合实现集合功能的实例,介绍了扩展Python内置类型的两种方法:通过嵌入内置类型来扩展类型和通过子类方式扩展类型. 通过嵌入内置类型扩展 下面例子通过将list对象作为嵌入类型,实现集合对象,并增加了一下运算符重载.这个类知识包装了Python的列表,

  • 使用C语言扩展Python程序的简单入门指引

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中. 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C++几乎相同的执行性能.执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人

  • Python中内置数据类型list,tuple,dict,set的区别和用法

    Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. List 字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List: L = [12, 'China', 19.998] 可以看到并不要求元素的类型都是一样的.当然也可以定义一个空的List: L = [] Python中的List是有序的,所以要访问List的话显然

  • 详解Python中内置的NotImplemented类型的用法

    它是什么? >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Python在内置命名空间中的六个常数之一.其他有False.True.None.Ellipsis 和 __debug__.和 Ellipsis很像,NotImplemented 能被重新赋值(覆盖).对它赋值,甚至改变属性名称, 不会产生 SyntaxError.所以它不是一个真正的"真"常数.当然,我们应

  • python基础教程之基本内置数据类型介绍

    Python基本内置数据类型有哪些 一些基本数据类型,比如:整型(数字).字符串.元组.列表.字典和布尔类型.随着学习进度的加深,大家还会接触到更多更有趣的数据类型,python初学者入门时先了解这几种类型就可以了. 基本内置数据类型对应符号 1)整型--int--数字python有5种数字类型,最常见的就是整型int.例如:1234.-12342)布尔型--bool--用符号==表示布尔型是一种比较特殊的python数字类型,它只有True和False两种值,它主要用来比较和判断,所得结果叫做

  • Python内置数据类型详解

    通常来说Python在编程语言中的定位为脚本语言--scripting language 高阶动态编程语言. Python是以数据为主,变量的值改变是指变量去指到一个地址. 即:Id(变量)->展示变量的地址. 因此一个具体的值,会有不同的变量名. Python的数据类型: 数字.字符串.列表.元组.字典 数字和字符串其实是很基本的数据类型,在Python中和其他语言相差不是很大的,在这里就不细讲了. Dictionary介绍: Dictionary是Python的内置数据类型之一,它定义了键和

  • Python中扩展包的安装方法详解

    前言 作为一个pythoner ,包的安装时必须懂的,这个语言跟matlab很类似,开源.共享,只要你有好的方法,都可以作为一个库,供大家下载使用,毕竟俗话说:"人生苦短,请用Python吗",下面话不多说,我们来一起看看详细的介绍吧. 方法如下: 1.单文件模块 将包拷贝到python安装目录下Lib下,eg:D:\py\Lib. 2.多文件模块 找到模块包(压缩文件zip或tar.gz)下载,进行解压,然后控制台中执行:python setup.py install xxx即可 3

  • 使用Pyrex来扩展和加速Python程序的教程

    Pyrex 是一种专门设计用来编写 Python 扩展模块的语言.根据 Pyrex Web 站点的介绍,"它被设计用来在友好易用的高级 Python 世界和凌乱的低级 C 世界之间搭建一个桥梁."虽然几乎所有的 Python 代码都可以作为有效的 Pyrex 代码使用,但是您可以在 Pyrex 代码中添加可选的静态类型声明,从而使得这些声明过的对象以 C 语言的速度运行. 加速 Python 从某种意义上来说,Pyrex 只是不断发展的 Python 类语言系列的一个部分:Jython

  • 详解Python的Django框架中manage命令的使用与扩展

    [简介] 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的

  • 详解Python的Django框架中的通用视图

    通用视图 1. 前言 回想一下,在Django中view层起到的作用是相当于controller的角色,在view中实施的 动作,一般是取得请求参数,再从model中得到数据,再通过数据创建模板,返回相应 响应对象.但在一些比较通用的功能中,比如显示对象列表,显示某对象信息,如果反复 写这么多流程的代码,也是一件浪费时间的事,在这里,Django同样给我们提供了类似的 "shortcut"捷径--通用视图. 2. 使用通用视图 使用通用视图的方法就是在urls.py这个路径配置文件中进

  • 详解Python的Django框架中的模版继承

    在实际应用中,你将用 Django 模板系统来创建整个 HTML 页面. 这就带来一个常见的 Web 开发问题: 在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码? 解决该问题的传统做法是使用 服务器端的 includes ,你可以在 HTML 页面中使用该指令将一个网页嵌入到另一个中. 事实上, Django 通过刚才讲述的 {% include %} 支持了这种方法. 但是用 Django 解决此类问题的首选方法是使用更加优雅的策略-- 模板继承 . 本质上来说,模板

  • 详解Python的Django框架中的模版相关知识

    HTML被直接硬编码在 Python 代码之中. def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) 尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意. 让我们来看一下

  • 详解Python的Django框架中的templates设置

    TEMPLATES Django 1.8的新特性 一个列表,包含所有在Django中使用的模板引擎的设置.列表中的每一项都是一个字典,包含某个引擎的选项. 以下是一个简单的设定,告诉Django模板引擎从已安装的应用程序(installed applications)的templates子目录中读取模板: TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,

  • 详解Python的Django框架中Manager方法的使用

    在语句Book.objects.all()中,objects是一个特殊的属性,需要通过它查询数据库. 在第5章,我们只是简要地说这是模块的manager .现在是时候深入了解managers是什么和如何使用了. 总之,模块manager是一个对象,Django模块通过它进行数据库查询. 每个Django模块至少有一个manager,你可以创建自定义manager以定制数据库访问. 下面是你创建自定义manager的两个原因: 增加额外的manager方法,和/或修manager返回的初始Quer

  • 详解Python的Django框架中inclusion_tag的使用

    另外一类常用的模板标签是通过渲染 其他 模板显示数据的. 比如说,Django的后台管理界面,它使用了自定义的模板标签来显示新增/编辑表单页面下部的按钮. 那些按钮看起来总是一样的,但是链接却随着所编辑的对象的不同而改变. 这就是一个使用小模板很好的例子,这些小模板就是当前对象的详细信息. 这些排序标签被称为 包含标签 .如何写包含标签最好通过举例来说明. 让我们来写一个能够产生指定作者对象的书籍清单的标签. 我们将这样利用标签: {% books_for_author author %} 结果

  • 详解Python的Django框架中的中间件

    什么是中间件 我们从一个简单的例子开始. 高流量的站点通常需要将Django部署在负载平衡proxy之后. 这种方式将带来一些复杂性,其一就是每个request中的远程IP地址(request.META["REMOTE_IP"])将指向该负载平衡proxy,而不是发起这个request的实际IP. 负载平衡proxy处理这个问题的方法在特殊的 X-Forwarded-For 中设置实际发起请求的IP. 因此,需要一个小小的中间件来确保运行在proxy之后的站点也能够在 request.

  • 详解Python的Django框架中的Cookie相关处理

    浏览器的开发者在很早的时候就已经意识到, HTTP's 的无状态会对Web开发者带来很大的问题,于是(cookies)应运而生. cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies 来看看它是怎么工作的. 当你打开浏览器并访问 google.com ,你的浏览器会给Google发送一个HTTP请求,起始部分就象这样: GET / HTTP/1.1 Host: google.com ... 当 Google响应时,

  • 详解Python的Twisted框架中reactor事件管理器的用法

    铺垫 在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: 监听事件 事件发生执行对应的回调函数 回调完成(可能产生新的事件添加进监听队列) 回到1,监听事件 因此我们将这样的异步模式称为Reactor模式,例如在iOS开发中的Run Loop概念,实际上非常类似于Reactor loop,主线程的Run Loop监听屏幕UI事件,一旦发生UI事件则执行对应的事件处理代码,还可以通过GCD等方式产生事件至主线程执行. 上图是boost对Reactor模式的描绘,Twisted的设计就是基于

随机推荐