django-extensions 文档

Django Extensions 是Django框架的扩展功能集合.

包括management命令扩展,数据库字段扩展,admin后台扩展等.

译者注: 文档中包含了部分 git , github , Python env 相关内容, 阅读时遇到相关只是请参考相应文档.

开始

了解Django Eextensions最简单的方式是查看 excllent screencast by Eric Holscher .只要几分钟的时间,Eric就能让你了解一半的扩展命令是做什么用的.

安装

通过 pipeasy_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

下载和安装

通过 pipeasy_install 安装

可以通过 pipeasy_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的 formmanager
  • 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_IMPORTSSHELL_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.pyadmin.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)
  • 递归引用
  • 排除自增字段
  • 父类不会被包含,除非没有子类继承它
  • 可以引用单独的类

还不支持的特性

  • 完美的支持引用字段(比如 自增字段 的引用)
  • Intermediate join tables: issue 48
  • GIS字段: issue 72 [1]

如何使用

从指定的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项目的环境变量执行脚本方法.

介绍

runscript 命令允许在django项目的环境下执行任意脚本.就像在 shell 命令中执行脚本一样:

$ python manage.py shell

开始使用

首先要在项目根目录下创建一个脚本的目录,名字是 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

可选用的格式

address

默认的文本格式,每个实例占一行并保存成如下格式:

"First Last" <user@host.com>;

这可以被用在任意的邮件服务中.

google

CSV格式文件,可以导入到google的应用中.可以被直接用在GMail中,在GMail中添加一组邮件列表,谷歌文档的邀请,谷歌文档权限批量修改,谷歌日历服务,等等.

输出文件仅包含两列.一列是用户名,一列是邮箱地址.这个格式也适合用来做电子表格文件.

outlook

CSV格式文件,可以导入到到Outlook,支持Outlook中的’必填’字段,但只有name和email有值.

linkedin

CSV格式文件,可以被导入到 LinkedIn Groups ,邀请列表中的用户加入该组.

包含3列数据: 邮箱 .这也是最适合电子表格的格式.

vcard

vCard格式,可以被导入到苹果系统的联系人目录中.

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相关类和方法

数据库字段扩展

概要:数据字段的扩展

数据库字段的扩展

  • TimeStampedModel - 抽象类,包含了由自己管理的 createdmodified 字段.

命名空间的建议

概要:命名空间的建议

简介

请使用 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

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

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错误页面).

werkzeug-traceback

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

werkzeug-options

这2个选项是:

查看源码

这是点击 显示源码 后的效果:

werkzeug-source

产看错误产生的源码有助于快速定位错误原因.抛出异常的部分被高亮显示,这样更方便查看.

有一个不够人性化的地方是,点击 查看源码 后,页面没有自动滚动到底部(源码显示的地方),这容易让人觉得什么都没有发生,其实是没有看到.

命令行调试

在错误页面上点击命令行调试按钮后,会显示出一个命令行调试工具(网页里面的输入框),是不是屌爆了:

werkzeug-debugger

这样就会出现一个基于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_ROOTSTATIC_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

依赖的库和配置

sync_s3 命令需要安装 boto 库,改命令在1.4c版本下测试通过:

当然还要添加AWS账户的S3密钥,在项目配置文件 settings.py 文件中增加配置:

# settings.py
AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''
[1]S3是亚马逊提供的云存储服务,也是目前行业中使用最广泛的云存储服务.2013年底亚马逊云服务才宣布正式入化,估计2014年中旬才能用上.

sqldiff

概要:sqldiff 命令会检测指定app与数据库表之间的差别,并输出数据库表的修改语句.

sqldiff 命令不是用来合并数据库差别的工具,虽然能够查看区别,但这个命令的设计初衷只是检查数据库表结构与django数据模型的区别.

支持的数据库

sqldiff 命令当前支持的数据库:

  • PostgreSQL
  • Sqlite3
  • MySQL
  • Oracle

欢迎提供支持其它数据库的 patch ! :-)

用法举例

查看所有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中来执行.

如果有合适的方法证明当前用户有修改数据库的权限,那就可以把输出结果直接导入到数据库中.但是因为项目的配置方式,这种直接修改数据库的方式是不能接受的.

用法举例

PostgreSQL

$ ./manage.py sqlcreate [--router=<routername>] | psql -U <db_administrator> -W

MySQL

$ ./manage.py sqlcreate [--router=<routername>] | mysql -u <db_administrator> -p

存在的问题

  • CREATE DATABASE 不是SQL标准语句,所以可能不能支持所有数据库 [1].
  • 回滚数据库时没有创建用户名及密码,但会尝试将数据库权限分配一个用户 [2] .
  • 缺少表空间的设置,等等.
[1]sqlite3 数据库创建就不是通过CREATE DATABASE语句,不过绝大多数数据库都没问题.
[2]译者也不确定明白这个问题指的是什么.sorry.

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到最新的稳定版,以免欠下技术债.