django-extensions 文档¶
Django Extensions 是Django框架的扩展功能集合.
包括management命令扩展,数据库字段扩展,admin后台扩展等.
译者注: 文档中包含了部分 git , github , Python env 相关内容, 阅读时遇到相关只是请参考相应文档.
开始¶
了解Django Eextensions最简单的方式是查看 excllent screencast by Eric Holscher .只要几分钟的时间,Eric就能让你了解一半的扩展命令是做什么用的.
安装¶
通过 pip 或 easy_install 安装 django-extensions:
$ pip install django-extensions
或:
$ easy_install django-extensions
还可以从github上下载源码安装:
$ git clone git://github.com/django-extensions/django-extensions.git
$ cd django-extensions
$ python setup.py install
更多安装细节,查看 安装django-extensions.
兼容性¶
django-extensions 尽量根据Django版本发布计划支持相应的Django和Python版本 [1].
新版本的 django-extensions 可能在旧版本的Django或Python中也会正常运行,但是我们已经放弃修复与旧版本Django或Python的兼容性bug.
当前最低的Python版本要求是2.5 [2].
目录¶
安装django-extensions¶
概要: | 安装django-extensions |
---|
下载和安装¶
通过 pip 或 easy_install 安装¶
可以通过 pip 或 easy_install 安装 django-extensions
$ pip install django-extensions
或:
$ easy_install django-extensions
下载源码安装¶
从 http://pypi.python.org/pypi/django-extensions/ 下载最新的源码.解压缩后,在目录下执行Python安装命令:
python setup.py install
...这样就可以自动安装了. 注: 这是Python默认的包安装方式.
在Django中使用¶
在Django项目的配置文件中,把 django_extensions 添加到 INSTALLED_APPS 列表中:
INSTALLED_APPS = (
...
'django_extensions',
)
这样就可以在Django的命令行中使用 django-extensions 提供的扩展命令了.
再次运行 ./manage.py help 命令时,就可以看到新的命令.
有些新增的命令依赖其它程序或Python库,例如 [1]
- ‘export_emails’ 需要 python vobject 模块来创建vcard文件
- ‘graph_models’ 需要 pygraphviz 库来渲染图片文件.
如果执行的django-extensions命令依赖的程序或库没有安装(或不在当前的环境中),那么这条命令被执行时会抛出异常,并提示缺少的依赖程序或库.
版本控制¶
django-extensions 目前被托管在github上: https://github.com/django-extensions/django-extensions
django command extensions 的dev版本在包含了新特性的同时还可以稳定运行,在正式环境下也推荐使用 [2].
使用git命令克隆 django-extensions 源码到本地:
git clone git://github.com/django-extensions/django-extensions.git
下载源码后可以在项目根目录下执行 python setup.py install 安装,或将 extensions 目录添加到Python环境变量中.最通用的做法是创建一个软连接指向代码的目录,并将软连接添加到Python环境变量中.比如Python的site-packages目录 [3]:
ln -sf /full/path/to/django-extensions/django_extensions /usr/lib/python2.7/site-packages/django_extensions
检查django-extensions是否被正确安装,在Python的shell中输入下面命令 [4]:
>>> import django_extensions
>>> django_extensions.VERSION
(1, 2, 5)
注意:通过git克隆出来的代码比通过源包(pypi)安装的代码版本更新.通过源码安装虽然可能会包含bug或兼容性问题,但也会包含一些新特性.
[1] | vcard是电子名片的格式 |
[2] | 在线上的服务中同样可以使用dev版的command extensions,不过通过pip安装时只会安装stable版本,如果要用dev就要手动安装.注意: 这里推荐的是 command extensions ,而不是 django-extensions |
[3] | Python的环境变量可以在多个地方,译者不认为建立代码目录软连接到系统环境变量的方式不够优美,推荐使用pip安装 |
[4] | 或在shell中执行 python -c ‘import django_extensions;print django_extensions.VERSION’ |
management命令扩展¶
概要: | management扩展命令列表 |
---|
- shell_plus - Django shell的加强版. 自动载入所有app的models,可以方便的使用这些ORM.
- create_app - 新建一个app的简便方法,可以通过 --template 参数指定一个app作为创建模板 [1].
- create_command - 在指定app内创建一个命令扩展目录,方便添加新的扩展命令(或者只能手动创建扩展命令的目录).
- create_jobs - 在指定app内创建一个定时任务扩展目录,可以定期执行指定任务.
- create_superuser - 方便的创建一个超级管理员 [2].
- describe_form - 显示针对一个model的form描述.复制输出的内容到forms.py中可以完整定义一个对应model的form.
- dumpscript - 生成一个Python脚本.包含指定app的所有数据对象.与Django的 dumpdata 命令不同的是 dumpscript 导出的是Python对象,而不是纯数据.这种导出数据的方式比直接导出数据或XML文件更容易理解,也更灵活.
- export_emails - 从用户表中导出联系人信息,支持多种导出格式: 地址,谷歌,Outlook,LinkedIn和VCard.
- generate_secret_key - 重新生成一个项目密钥, settigns.py 文件中的 SECRET_KEY 配置.
- graph_models - 生成一个 GraphViz 文件.将输出内容写入一个文件.以图形化数据模型.传入多个app的名字作为参数,可以在一个文件中显示多个模型的图形化格式 [3].
- mail_debug - 开启一个邮件服务,将Django项目发出的邮件从控制台输出,而不是真的发送出去.
- passwd - 重新设定某个用户的密码,用法: ./manage.py passwd [用户名] .
- print_settings - 与 diffsettings 命令功能类似,但会显示Django的全部配置.
- print_user_for_session - 通过 session key 来查看当前用户信息,这个方法在查找哪个用户行为导致程序异常非常有帮助.
- reset_db - 重置数据库 (目前支持 sqlite3, mysql, postgres).
- runjob - 执行一个单独的任务,是 django-extensions 任务系统中的一个功能.
- runjobs - 执行计划任务. 分为按小时执行,按天执行,按周执行,按月执行.是 django-extensions 任务系统中的一部分功能.
- runprofileserver - 在启动 runserver 测试服务的同时,其用 profile 功能,可以记录服务的详细日志,包含了对于Python方法的详细执行分析.在服务器性能分析时,这是最佳方法了.
- runscript - 在当前项目的环境下执行脚本.
- runserver_plus - 在Werkzeug debugger模式下开启服务. 需要安装 Werkzeug.这是个杀手级应用.
- set_fake_passwords - 将所有用户的密码设置为一个统一值 (默认密码). 一定要在测试环境下使用.
- show_urls - 统一显示项目中包含的所有url.
- sqldiff - 显示app的models与数据库中的表的差别.这个功能非常好用,但还处于实验阶段,虽然不能捕获所有异常,但能很好的检查出不同的内容 [4].
- sqlcreate - 根据配置文件的内容,生成创建数据库表的SQL语句.
- sync_s3 - 将settings.MEDIA_ROOT目录中文件复制到S3中.可以通过参数设置否是使用gzip压缩,文件编码,文件的缓存时间等.
[1] | Django1.6版本也开始支持通过模板创建app, 参考 https://docs.djangoproject.com/en/1.6/ref/django-admin/#startapp-appname-destination |
[2] | 没看到命令列表里有这个命令哇!!! |
[3] | 类似MySQL的relationship map, 将models的关系以描述方式输出,虽然是文本描述,但是使用了GraphViz格式,可以打开成图形 |
[4] | 目前Django项目中数据库表管理基本都使用Python的South库,跟Django可以很好的正好到一起,管理数据库也十分方便. |
management命令计划功能¶
概要: | 这是扩展命令的计划功能,在未来版本中会得到支持 |
---|
- 创建app的 form 和 manager
- CSS和JS文件的合并压缩功能
译者注: django-extensions 的新命令增加的功能会依照目前项目的需要.Django版本在演化过程中逐渐增加了很多很有用的命令.CSS和JS文件的合并压缩功能对于某些项目可能并不需呀,因为我们可以在Django项目中包含自己的静态文件解决方案,比如百度的FIS
admin后台管理扩展¶
概要: | Admin后台的字段扩展 |
---|
ForeignKeyAutocompleteAdmin - 该扩展字段在Admin后台中显示为一个搜索输入框.前端显示的内容由 ForeignKeySearchInput form的weight渲染,通过jQuery的autocompletion功能实现搜索效果.
shell_plus¶
概要: | shell命令的扩展命令,运行Django shell的同时自动加载所有app的models,并选择使用Python shell的版本. |
---|
交互式的 Python Shells¶
shell_plus支持3种交互的Python shell.
BPython:
$ ./manage.py shell_plus --use-bpython
IPython:
$ ./manage.py shell_plus --use-ipython
Python:
$ ./manage.py shell_plus --use-plain
默认shell优先顺序是: bpython, ipython, python.
也可以在 settings.py 配置中指定优先选择的shell工具:
# 在shell_plus中使用ipython作为交互工具
SHELL_PLUS = "ipython"
配置¶
如果遇到apps中包含的的models名字出现冲突,或不想载入特定apps的models的情况,可以通过配置别名的方法解决:
提示: 下列配置仅在shell_plus中生效,不会影响当前项目运行的环境变量:
# 将自动载入的Messages模块重命名为blog_messages
SHELL_PLUS_MODEL_ALIASES = {'blog': {'Messages': 'blog_messages'},}
# 不加载sites app和pictures的blog模型
SHELL_PLUS_DONT_LOAD = ['sites', 'blog.pictures']
设置别名和声明不加载的配置可以同时使用.也可以通过命令行参数谁知不加载的模块:
$ ./manage.py shell_plus --dont-load app1 --dont-load app2.module1
命令行的参数和配置文件中的设置是可以同时使用的,所以一次性的参数完全可以通过命令行运行,省去频繁修改配置文件的麻烦.
shell_plus还能使用 IPython Notebook .将浏览器作为交互的shell:
$ ./manage.py shell_plus --notebook
IPython Notebook 中也会将所有模块和models加载到全局变量中.
IPython NoteBook 中自动加载模块功能是通过参数配置的,默认为启用状态.:
--ext django_extensions.management.notebook_extension
自定义 IPython Notebook 配置需要覆盖Django项目的 IPYTHON_ARGUMENTS 配置:
IPYTHON_ARGUMENTS = [
'--ext', 'django_extensions.management.notebook_extension',
'--ext', 'myproject.notebook_extension',
'--debug',
]
想在 IPython Notebook 中启用自动加载功能,要么包含django-extensions默认的notebook扩展配置,要么把自动加载的代码拷贝到自定义的扩展中.
提示: IPython Notebook 的特性中不能识别 --dont-load 参数.
附加的引入模块¶
在配置文件中设置 SHELL_PLUS_PRE_IMPORTS 和 SHELL_PLUS_POST_IMPORTS 可以指定附加的引入模块.第一个配置中添加的模块会先于所有模块加载,第二个配置中添加的模块会后于所有模块加载.这两个配置的格式相同,在settings.py文件中添加:
SHELL_PLUS_PRE_IMPORTS = (
('module.submodule1', ('class1', 'function2')),
('module.submodule2', 'function3'),
('module.submodule3', '*'),
'module.submodule4'
)
上面的配置被转换为Python的引入代码结果,如下所示:
from module.submodule1 import class1, function2
from module.submodule2 import function3
from module.submodule3 import *
import module.submodule4
这些引入的变量在shell执行时就可以使用了.
create_app¶
概要: | 创建一个app的简要方法. |
---|
--template 参数指定使用一个模板来创建新的app.
--diagram 参数能够从 .dia 文件生成 models.py 和 admin.py.
用法举例¶
例子需要在项目的根目录下执行,该目录下要包含 settings.py 文件 [1]
# 获取命令行的帮助
./manage.py create_app --help
# 从 [APP_NAME].dia 文件中生成 ``models.py`` 和 ``admin.py`` ,这个文件应该放在与 ``settings.py`` 相同的文件目录下
./manage.py create_app -d APP_NAME
从sample.dia文件生成app¶
./manage.py create_app --diagram=sample.dia webdata
-d 参数或 --diagram 参数通过 dia2django 生成models.py, 详细文档查看 django wiki.
译者注: 新版本Django原生命令 startapp 也提供了通过 --template 指定模板来创建app的功能
[1] | 这个说法不准确,Django1.4版本后就独立出了配置文件目录,settings.py文件不在项目根目录下.但是这不影响使用,因为项目配置文件是通过manage.py文件指定的. |
dumpscript¶
概要: | 生成单独的Python脚本,包含指定app对应的数据库数据对象.可以用来将数据表导入数据库. |
---|
dumpscript 命令生成单独的Python脚本,包含了转换成Python对象的数据库数据.这种方法比直接创建数据库或通过XML创建数据库更容易理解,扩展性也更好.
为什么有这个功能¶
这样做的有几点好处:
- 数据库变更时会少出现些莫名其妙的错误: 不依赖ID的外键,会忽略掉新增和删除的列
- 编辑脚本后可以自动生成很多的实例数据
例如,编辑一个脚本,生成一些测试的初始数据到数据库中:
for i in xrange(2000):
poll = Poll()
poll.question = "Question #%d" % i
poll.pub_date = date(2001,01,01) + timedelta(days=i)
poll.save()
真实情况下数据库可能更大更复杂,通常是通过Admin后台生成一下测试数据,再导出脚本.编辑导出的脚本,得到更多的数据.
特性支持¶
- 外键和多对多关系(通过Python变量,而不是ID)
- 外键或多对多中对自己的引用
- models子类
- ContentType 字段类型,并生成关联关系(查看 issue 43)
- 递归引用
- 排除自增字段
- 父类不会被包含,除非没有子类继承它
- 可以引用单独的类
如何使用¶
从指定的app中导出所有models的建表语句:
$ ./manage.py dumpscript appname > scripts/testdata.py
导出指定模型的数据,添加参数 appname.ModelName
$ ./manage.py dumpscript appname.ModelName > scripts/testdata.py
清空指定app对应数据库数据,然后重新加载数据:
$ ./manage.py reset appname
$ ./manage.py runscript testdata
提示: runscript 命令只能执行在 scripts 模块下的脚本,所以要在 scripts 目录下创建 __init__.py 文件.
警告¶
命名冲突¶
在命名输出文件时不要与当前环境路径下的文件重名,否则会引起import异常.比如输出到的目标文件与app目录重名时,脚本会尝试加载输出文件而不是app,这是不正确的.
例子:
# 错误用法
$ ./manage.py dumpscript appname > dumps/appname.py
# 正确用法
$ ./manage.py dumpscript appname > dumps/appname_all.py
# 正确用法
$ ./manage.py dumpscript appname.Somemodel > dumps/appname_somemodel.py
[1] | GIS字段依赖于数据库,不同的数据库生成GIS的方式和索引不同 |
runscript¶
该要: | 在当前项目环境下执行脚本,这个功能非常有用,它能够允许在不启动Django服务的同时以Django项目的环境变量执行脚本方法. |
---|
开始使用¶
首先要在项目根目录下创建一个脚本的目录,名字是 scripts
$ mkdir scripts
$ touch scripts/__init__.py
然后,创建一个想要执行的Python脚本:
$ touch scripts/delete_all_polls.py
这个脚本文件中必须包含 run() 方法, runscript 命令执行时会自动调用该方法.这个脚本中可以引用django项目中的任意模块或数据模型.
例如:
# scripts/delete_all_polls.py
from Polls.models import Poll
def run():
# Get all polls
all_polls = Poll.objects.all()
# Delete polls
all_polls.delete()
提示: runscript 命令可以找到任意app下 scripts 目录中的脚本文件.
用法¶
runscript 命令可以在shell中调用 scripts 目录下的Python脚本.
例如:
$ python manage.py runscript delete_all_polls
提示: runscript 命令会首先检查每个app下的 scripts 目录,如果找到对应名字的脚本就会执行.然后检查 project_root/scripts 目录下是否包含符合名字的脚本,如果找到也会执行.也就是说,我们可以在不同的app中创建相同名字的脚本,并且都会被执行.
export_emails¶
概要: | 以不同的格式导出用户的邮件列表 |
---|
大部分Django站点包含注册用户的信息.有时我们需要将用户邮箱信息导入到其它系统中(生成邮件, GMail, google docs, 修改权限, LinkedLn用户组等等). export_emails 命令为此而设计.导出的用户信息的同时可以对其进行分组.
用法举例¶
将所有用户信息导出成 '"First Last" <my@addr.com>;' 格式:
$ ./manage.py export_emails > addresses.txt
以LinkedIn pre-approve格式从 Attendees 组中导出用户信息:
$ ./manage.py export_emails -g Attendees -f linkedin pycon08.csv
以GMail(Google Docs)格式创建一个CSV文件:
$ ./manage.py export_emails --format=google google.csv
model字段扩展¶
概要: | 数据模型model的字段扩展 |
---|
当前数据模型的字段的扩展¶
- AutoSlugField - 自动生成一个唯一的slug,生成方式是以迭代方式给当前字段后面添加一个随机字符,知道不重复为止.slug生成方式的灵感来自于 SmileyChris 的唯一码生成代码片段.
- CreationDateTimeField - DateTimeField类型字段,会自动保存数据第一次被保存到数据库的时间戳.工作方式与添加了 auto_now_add=True 参数相同,而 auto_now_add 参数已经不推荐使用.
- ModificationDateTimeField - DateTimeField类型字段,当数据出现修改是会自动保存被修改的时间戳.工作方式与添加了 auto_now=True 参数相同,而 auto_now 参数已经不推荐使用.
- UUIDField - 唯一标识码字段,通过本地Python模块生成的唯一标识码,支持所有版本的uuid.
- EncryptedCharField - 字符串类型字段,会将数据以加密的方式保存和现实,加密方法使用 Keyczar.使用这个扩展字段时需要安装Keyczar,通过Keyczar库生成加密的密钥,还要在django项目的 settings.py 中添加 settings.ENCRYPTED_FIELD_KEYS_DIR 配置,指向密钥的完整目录.
- EncryptedTextField - 字符串类型字段,与 EncryptedCharField 字段类似,但是继承自 TextField 字段.
graph_models¶
概要: | 将整个项目或指定app的models结果渲染成图形 [1]. |
---|
创建一个 GraphViz 格式文件,包含对于指定app的models的描述.可以传入多个app,这样就会把它们渲染到同一个文件中.输出结果通常是一个 .dot 后缀文件.
graph_model 命令可以通过些参数改变生成的图形,比如: 分组模型,包含继承,去除部分模型,改变模型中列的位置等.
新版本的 django-extensions 还可以直接渲染成一张图片,这个功能需要安装 pygraphviz 库.
选择生成图表的库¶
graph_model 命令可以指定使用哪个库来生成图片,使用参数 --pygraphviz 或 --pydot ,需要安装相应的依赖库.
默认选择 pygraphviz 库生成图表,如果没有指定参数,也没有安装 pygraphviz 库,则会抛出异常.
安装 pygraphviz 库:
$ pip install pygraphviz
安装是可能因为无法编译需要的C扩展而安装失败.那么可能需要尝试其它安装方法,或使用 PyDot.
安装 pydot 库:
$ pip install pyparsing==1.5.7
$ pip install pydot
安装过程很快,注意要安装指定版本的 pyparsing .否则可能会出错:
Couldn't import dot_parser, loading of dot files will not be possible.
默认配置¶
在项目的配置文件中可以使用 GRAPH_MODELS 配置生成图表时的默认参数:
GRAPH_MODELS = {
'all_applications': True,
'group_models': True,
}
配置的参数名与在命令行中的参数名是一样的,只要去掉作为参数的两个建号,并把参数中的减号换成下划线.
用例¶
安装 django-extensions 后,就可以创建 .dot 文件.或通过 graph_models 命令生成图表,看下面的例子:
# 创建一个 .dot 文件
$ ./manage.py graph_models -a > my_project.dot
# 创建一个PNG图片,包含应用的结构,把图片命名为my_project_visualized.png
$ ./manage.py graph_models -a -g -o my_project_visualized.png
# 这个例子中指明了使用哪个Python的图表库
$ ./manage.py graph_models --pygraphviz -a -g -o my_project_visualized.png
$ ./manage.py graph_models --pydot -a -g -o my_project_visualized.png
# 创建一个只包含 'foo' 和 'bar' 应用的 dot 文件
$ ./manage.py graph_models foo bar > my_project.dot
[1] | 渲染出的是图形的描述语言,需要用特定软件才能看到图形,如果用文本编辑器打开则会看到描述字符 |
定时任务¶
概要: | 在Django-extensions中使用定时任务. |
---|
定时的计划任务¶
本页介绍的功能正在努力改进中¶
新建一个与Django的命令执行方式类似的任务 [1].使用 create_jobs 命令在一个app内创建一个 ‘jobs’ 目录,然后可以创建不同的Python脚本执行不同的任务.
django_extensions.jobs 目录中包含了一些简单的例子.
Python的任务脚本继承定时任务类后就会被定义为任务,可以按小时,按天,按周或按月执行.继承的脚本必须实现 execute 方法,该方法在任务触发时会被自动执行.
与任务相关的命令还包括:
- create_jobs: 创建包含任务的目录
- runjob: 执行单独的任务
- runjobs: 执行所有任务
列出所有任务:
runjob[s] -l
未触发时,任务不会自己执行.
任务需要手动执行,或指定时间执行,或在 cron 中配置定期执行:
@hourly /path/to/my/project/manage.py runjobs hourly
@daily /path/to/my/project/manage.py runjobs daily
@weekly /path/to/my/project/manage.py runjobs weekly
@monthly /path/to/my/project/manage.py runjobs monthly
[1] | 意味着可以想Django的shell命令那样引入项目中的app相关类和方法 |
命名空间的建议¶
概要: | 命名空间的建议 |
---|
简介¶
请使用 django_extensions 的命名空间,而不是绝对路径
命名空间的建议¶
一些简单的建议:
- django_extensions.commands (20% 的人在正式环境中使用的绝对路径)
- django_extensions.commands.development (所有在开发中都会用到的功能)
- django_extensions.commands.extra
- django_extensions.db
- django_extensions.templates
- django_extensions.jobs
数据库部分使用方式都是正确的,因为目前只有一种引用方式:
from django_extensions.db.models import something
print_settings¶
概要: | print_settings 命令与Django的 diffsettings 命令相似,但是会输出当前项目中使用的全部配置(包括默认配置) |
---|
简介¶
Django使用 diffsettings 命令输出当前项目配置与默认配置的区别.有时也需要直接查看当前项目的所有配置,尤其是配置十分复杂的时候,比如都包含好几个配置文件 [1].例如,在测试和开发环境中使用不同的配置文件,并且都包含了默认的 settings.py 文件,这样就不能直观的查看配置文件了.
print_settings 命令支持从不同的格式文件中输出数据.
详情¶
最简单的输出配置命令如下,不需要添加参数:
$ python manage.py print_settings
以不同格式输出:
$ python manage.py print_settings --format=json
$ python manage.py print_settings --format=yaml # 需要安装 PyYAML
通过 --help 参数可以获取更多帮助:
$ python manage.py print_settings --help
Usage: manage.py print_settings [options]
Print the active Django settings.
Options:
-v VERBOSITY, --verbosity=VERBOSITY
Verbosity level; 0=minimal output, 1=normal output,
2=verbose output, 3=very verbose output
--settings=SETTINGS The Python path to a settings module, e.g.
"myproject.settings.main". If this isn't provided, the
DJANGO_SETTINGS_MODULE environment variable will be
used.
--pythonpath=PYTHONPATH
A directory to add to the Python path, e.g.
"/home/djangoprojects/myproject".
--traceback Print traceback on exception
--format=FORMAT Specifies output format.
--indent=INDENT Specifies indent level for JSON and YAML
--version show program's version number and exit
-h, --help show this help message and exit
[1] | django1.4版本后推荐配置文件全部都放在项目的 主app 内,到了1.6版本更进一步简化了配置文件包含的内容.但很多项目开发者会自己定义多个配置文件,以便用在不同的环境下 |
runprofileserver¶
首先,在跟踪分析一门语言和框架前,应该深入了解一下正在使用的语言(框架),这样才能事半功倍.不够扎实的功底会导致在跟踪分析服务时做出错误的假设和判断.有一条经验法则很实用:干净整洁的代码比热情和耐心更实用.
这部分功能正在持续改进中,如果你有好的办法能够跟踪,分析Django框架,请给我们留言
简介¶
runprofileserver 命令在启动django服务的同时其用了跟踪分析工具,会将服务的分析信息保存到 .prof 后缀文件中.使用 --prof-path 参数指定保存分析文件到指定目录.每一个请求的分析数据都会被保存成一个profile文件.
如果没有指定 --prof-path 参数,分析数据的 .prof 文件会被保存到 /tmp 目录下.建议使用特定目录保存分析文件,这样方便我们随时查看分析数据,也不会弄乱 /tmp 目录,使用windows系统时一定要指定``–prof-path`` 参数,因为windows系统没有 /tmp 目录.
分析文件的名字默认名字是:
{path}.{duration:06d}ms.{time}
也可以通过 --prof-file 参数指定生成的服务分析文件名字.文件名格式规则参考: Format Specification.
例如:
- “{time}-{path}-{duration}ms” - 用请求的道达时间命名分析文件.
- “{duration:06d}ms.{path}.{time}” - 用请求的相应时间命名分析文件.
聚合profile¶
Django提供了一个profile文件聚合的工具 gather_profile_stats.py ,在Django安装目录的 bin 目录下可以找到.
KCacheGrind¶
新版本的 runprofileserver 命令可以把分析的结果文件保存成 KCacheGrind 格式文件,这样就可以通过 KCacheGrind 的分析工具来查看分析数据.
例子:
$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
Validating models...
0 errors found
Django version 1.0-post-release-SVN-SVN-unknown, using settings 'complete_project.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[13/Nov/2008 06:29:38] "GET / HTTP/1.1" 200 41107
[13/Nov/2008 06:29:39] "GET /site_media/base.css?743 HTTP/1.1" 200 17227
[13/Nov/2008 06:29:39] "GET /site_media/logo.png HTTP/1.1" 200 3474
[13/Nov/2008 06:29:39] "GET /site_media/jquery.js HTTP/1.1" 200 31033
[13/Nov/2008 06:29:39] "GET /site_media/heading.png HTTP/1.1" 200 247
[13/Nov/2008 06:29:39] "GET /site_media/base.js HTTP/1.1" 200 751
<ctrl-c>
$ kcachegrind /tmp/my-profile-data/root.12574391.592.prof
相关知识链接¶
- http://code.djangoproject.com/wiki/ProfilingDjango
- http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/
- http://code.djangoproject.com/browser/django/trunk/django/bin/profiling/gather_profile_stats.py
- http://www.oluyede.org/blog/2007/03/07/profiling-django/
- http://simonwillison.net/2008/May/22/debugging/
runserver_plus¶
概要: | runserver_plus 命令启动测试服务,并用 Werkzeug 作为调试后台,这个命令是对原生命令 runserver 的扩展,提供了更强的错误调试功能. |
---|
简介¶
runserver_plus 命令需要安装 Werkzeug WSGI utilities . Werkzeug 是Python作为web服务的杀手级调试工具,还能进行基于ajax的错误断点调试(允许在出错的地方执行代码). 当然还提供了一个漂亮的错误展示页面.
开始使用¶
在启动Django的测试服务时,只要用 runserver_plus 命令代替 runserver 命令就可以了:
$ python manage.py runserver_plus
* Running on http://127.0.0.1:8000/
* Restarting with reloader...
Validating models...
0 errors found
Django version 0.97-newforms-admin-SVN-unknown, using settings 'screencasts.settings'
Development server is running at http://127.0.0.1:8000/
Using the Werkzeug debugger (http://werkzeug.pocoo.org/)
Quit the server with CONTROL-C.
runserver_plus 命令接受原来的所有参数.也就是可以随意指定端口和host,跟原生的 runserver 命令一模一样.
深入使用¶
runserver_plus 启动的服务遇到代码抛出异常时,会得到一个 Werkzeug 的错误显示页面(不是默认的Django错误页面).

当鼠标划过特定错误行(堆栈)时,就会显示出当前位置的调试扩展功能,注意图片右边出现的2个按钮:

这2个选项是:
查看源码¶
这是点击 显示源码 后的效果:

产看错误产生的源码有助于快速定位错误原因.抛出异常的部分被高亮显示,这样更方便查看.
有一个不够人性化的地方是,点击 查看源码 后,页面没有自动滚动到底部(源码显示的地方),这容易让人觉得什么都没有发生,其实是没有看到.
命令行调试¶
在错误页面上点击命令行调试按钮后,会显示出一个命令行调试工具(网页里面的输入框),是不是屌爆了:

这样就会出现一个基于ajax的命令行调试工具,输入的命令通过ajax方式发送到后台,再把返回的结果输出,然后就可以任意发挥了.截图中,在调试框里输入了 print environ 命令来查看当前环境中给方法传入了哪些参数.
注意 : 该方法不能被用在任何正式环境中,即使是在正式环境中检测问题时也不行.命令行调试工具允许在服务器端执行Python命令,这是非常危险的.
SSL¶
runserver_plus 还支持SSL,这样就可以方便的调试 https 请求了.使用SSL时需要提供证书的名字, runserver_plus 会自动生成一个证书:
$ python manage.py runserver_plus --cert cert
Validating models...
0 errors found
Django version 1.6.dev20130122125534, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Using the Werkzeug debugger (http://werkzeug.pocoo.org/)
Quit the server with CONTROL-C.
* Running on https://127.0.0.1:8000/
* Restarting with reloader
Validating models...
0 errors found
Django version 1.6.dev20130122125534, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Using the Werkzeug debugger (http://werkzeug.pocoo.org/)
Quit the server with CONTROL-C.
执行上面的命令后就可以通过 https://127.0.0.1:8000 在安全模式下访问服务了.在项目目录下会创建2个新的文件,分别是密钥文件和证书文件.重启测试服务时,这2个文件会被保留下来,这样浏览器就不用反复处理证书授权了.如果想使用指定证书文件,可以使用路径参数指向该证书文件:
$ python manage.py runserver_plus --cert /tmp/cert
使用SSL时需要安装 OpenSSL 库. Werkzeug 0.9版本后才允许重用证书文件.通过以下命令安装 OpenSSL 库:
$ pip install pyOpenSSL
sync_s3¶
概要: | 将项目的 MEDIA_ROOT 和 STATIC_ROOT 目录包含的文件同步到S3 [1]. |
---|
sync_s3 命令会检索配置中的 settings.MEDIA_ROOT 目录和 settings.STATIC_ROOT 目录,然后把所有文件资源上传到S3的相同的目录结构下.
sync_s3 命令可以启用以下功能,通过传入参数启用对应功能,默认全部关闭:
* gzip 压缩CSS和JS文件,并添加 ``Content-Encoding`` 头.
* 设置文件缓存过期时间
* 只上传 media 或 static 目录文件.
用法举例¶
上传到S3的 mybucket
$ ./manage.py sync_s3 mybucket
上传到S3的 mybucket ,并对CSS/JS文件进行gzip压缩和添加缓存过期时间:
$ ./manage.py sync_s3 mybucket --gzip --expires
只上传 media 文件到S3的 mybucket 中:
$ ./manage.py sync_s3 mybucket --media-only # or --static-only
sqldiff¶
概要: | sqldiff 命令会检测指定app与数据库表之间的差别,并输出数据库表的修改语句. |
---|
sqldiff 命令不是用来合并数据库差别的工具,虽然能够查看区别,但这个命令的设计初衷只是检查数据库表结构与django数据模型的区别.
用法举例¶
查看所有app数据模型与数据库之间的区别:
$ ./manage.py sqldiff -a
用文本显示所有app数据模型与数据库之间的区别:
$ ./manage.py sqldiff -a -t
sqlcreate¶
概要: | sqlcreate 命令可以更方便的创建数据库. |
---|
简介¶
不用再手动创建数据库, settings.py 文件中已经包含了需要的信息,所以Do It Yourself.
用法¶
$ python manage.py sqlcreate [--router=<routername>] | <my_database_shell_command>
sqlcreate 命令会将SQL语句输出用来检查(如果你想检查的话).但最终还是要输入到数据库的shell中来执行.
如果有合适的方法证明当前用户有修改数据库的权限,那就可以把输出结果直接导入到数据库中.但是因为项目的配置方式,这种直接修改数据库的方式是不能接受的.
validate_templates¶
概要: | 检查模板的语法错误或编译错误. |
---|
参数¶
verbosity¶
该参数表示使用高级输出错误信息详细级别,会将所有检查过的模板的错误全部输出.否则只会输出最近的查找到错误的文件信息.
break¶
遇到错误就直接输出不再继续检查
includes¶
通过参数 -i (可以重复使用)来添加自定义的模板目录
配置¶
VALIDATE_TEMPLATES_EXTRA_TEMPLATE_DIRS¶
通过 VALIDATE_TEMPLATES_EXTRA_TEMPLATE_DIRS 配置可以指定所有模板目录的前缀.这个配置主要针对 TEMPLATE_DIRS 是动态的或模板目录是通过中间件生成的情况.扩展app的模板,比如Django项目中若是包含的 celery 模块也可以通过指定该参数来进行模板语法检测.
用法举例¶
./manage.py validate_templates
译者注: validate_templates 命令适用与检测Django框架原生模板,如果使用了其它模板(jinja等),则该命令会失去检测效果.
[1] | Django的某个版本指定了需要的Python版本,支持某个Django版本就代表同事支持相应的Python版本. |
[2] | 目前最新的Django1.6版本后要求不能使用Python2.6以前的版本,这也是未来Django对Python的最低要求.应及时升级Django到最新的稳定版,以免欠下技术债. |