Django Shell 增强

由于 Django 系统的特殊性,很难在 Shell 中直接导入 Django 应用,而只能使用它自己提供的 shell 命令。不过,并不是说就没有办法使用增强的第三方 Shell 了,Django-Extensions 插件提供了切换默认 Shell 的能力。

Django Extensions

Django-Extensions 是一个 Django 第三方插件集,其中囊括了很多实用的 Django 插件, 当然也包括本文的主角 shell_plus

shell_plus

装上插件后只需要将 django_extensions 加入 INSTALLED_APPS 列表中即可使用 IPython 作为默认 Shell(如果已安装的话)。 需要注意的是,如果在 virtualenv 环境中使用 Django 的话,同样需要在 virtualenv 中安装 IPython。

如果你偏好的是 BPython 的话,shell_plus 同样提供了相关命令:shell_plus。使用方法:

./manage.py shell_plus --bpython

该命令对 IPython 同样适用:

./manage.py shell_plus --ipython

或者,有需要的话,也可以切换回原生 Python:

./manage.py shell_plus --plain

默认 Shell 的选择顺序是 BPython、IPython、Python。

你同样可以在文件中配置默认 Shell:

SHELL_PLUS = "ipython"

设置

默认情况下 shell_plus 会自动加载你的全部 Model,其中可能会出现重名或者其它问题, 你可以通过配置文件来修改它的加载机制。

注意:这里的设置只会作用于 shell_pull 而不会影响你的整改系统。

将名为 blog 的 app 中 的 Messages 模块以 blog_messages 名加载

SHELL_PLUS_MODEL_ALIASES = {'blog': {'Messages': 'blog_messages'},}

不加载 app 'sites' 中的全部 model,以及 app 'blog' 中的 'pictures' Model。

SHELL_PLUS_DONT_LOAD = ['sites', 'blog.pictures']

SHELL_PLUS_MODEL_ALIASESSHELL_PLUS_DONT_LOAD 可以同时使用。

也可以像这样在运行 manage.py 时再设定不自动加载的模块:

./manage.py shell_plus --dont-load app1 --dont-load app2.module1

命令行和配置文件中的设置会合并后再生效。

IPython Notebook

shell_plus 同时还支持 [IPython Notebook]:

./manage.py shell_plus --notebook

Notebook 相关的设置参数有两个:NOTEBOOK_ARGUMENTSIPYTHON_ARGUMENTS

NOTEBOOK_ARGUMENTS 用于配置 IPython Notebook:

ipython notebook -h
NOTEBOOK_ARGUMENTS = [
    '--ip=x.x.x.x',
    '--port=xx',
]

IPYTHON_ARGUMENTS 用于设置 IPython:

ipython -h

使用 IPython Notebook 时同样会自动加载 Django settings 模块和数据库 Model。 其实现依赖于定制的 IPython 插件,Django Extensions 默认会向 IPython Notebook 发送命令 --ext django_extensions.management.notebook_extension 开启该功能, 你可以在 Django 设置中修改 IPYTHON_ARGUMENTS 参数覆盖该设置:

IPYTHON_ARGUMENTS = [
    '--ext', 'django_extensions.management.notebook_extension',
    '--ext', 'myproject.notebook_extension',
    '--debug',
]

开启自动加载可以通过引用 Django Extensions 默认 Notebook,或者复制它的自动加载代码到你自己的扩展中。

IPython Notebook 扩展目前并不支持 --dont-load 选项。