详解Python的Django框架中manage命令的使用与扩展
作者:心内求法 发布时间:2021-01-04 05:09:27
【简介】
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!
猜你喜欢
- 本例已经实现的数据库password,数据库的表以及表结构如下:表中已经插入的信息:实现思路无非是用户完成账户密码输入并点击登录
- 本文实例讲述了JS实现的倒计时效果。分享给大家供大家参考,具体如下:我们经常会看到某些网站在注册的时候喜欢搞个按钮倒计时的效果,就是多少秒之
- 什么是 Python 中的 Lambda 函数今天我们来学习 Python 中的 lambda 函数,并探讨使用它的优点和局限性Let
- 本文实例讲述了vuex实现的简单购物车功能。分享给大家供大家参考,具体如下:购物车组件<template> <
- 在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,M
- PyScript可以让你在浏览器中直接运行Python脚本,与JavaScript并排,在你的代码和网页之间进行双向互动。由Anaconda
- 可直接用这行命令!: pip install -U scikit-learn其他命令: (1)更新pippython -m pip inst
- 三遍记忆,让你记住海量素材的准确位置和用途,提高其可用性.这仅仅是一个示意图.在以往的日子里,我做到了只要脑袋里冒出一个想法,立刻就能知道我
- 先前我们讲的都是“线性结构”,他的特征就是“一个节点最多有一个”前驱“和一个”后继“。那么我们今天讲的树会是怎样的呢?我们可以对”线性结构“
- 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用。但是如果离
- 原理:TensorFlow使用的求导方法称为自动微分(Automatic Differentiation),它既不是符号求导也不是数值求导,
- 锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:丢失更新A,B两个用户读同一数据并进行修改,其中
- 写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种:图像类滑动类点击类语音类今天先来看看图像类,这类验证码大多是数字、字母的组合
- 利用python3来实现TCP协议,和UDP类似。UDP应用于及时通信,而TCP协议用来传送文件、命令等操作,因为这些数据不允许丢失,否则会
- 一、闭包闭包的形成条件:1.函数嵌套。2.内部函数使用了外部函数的变量或者参数。3.外部函数返回了使用外 部变量的内部函数。二、一个简单的例
- 本文实例为大家分享了原生js实现tab选项卡切换效果的代码,供大家参考,具体内容如下1.html部分<body> <div
- 本文实例讲述了MYSQL锁表问题的解决方法。分享给大家供大家参考,具体如下:很多时候!一不小心就锁表!这里讲解决锁表终极方法!案例一mysq
- 内连接(inner join)。 外连接: 全连接(full join)、左连接(left join)、右连接(right join)。 交
- 本文实例讲述了Python实现连接postgresql数据库的方法。分享给大家供大家参考,具体如下:python可以通过第三方模块连接pos
- 最新MySql8.27主从复制以及SpringBoot项目中的读写分离实战1、MySql主从复制MySQL主从复制是一个异步的复制过程,底层