如何为django-extensions的shell_plus会话添加本地变量
如何为django-extensions的shell_plus会话添加本地变量
我明白你的困扰——自己手动写管理命令要重复处理模型映射,还没法复用shell_plus已经帮你准备好的settings、模型这些环境,同时又想把自己的字典键值对直接丢进shell会话里用。其实有几个简单的办法可以解决这个问题:
方法一:用shell_plus的--startup参数加载脚本
这是最直接的方式,你可以写一个初始化脚本,把需要的变量注入到shell环境中,然后让shell_plus启动时自动执行它。
- 先创建一个启动脚本,比如
shell_startup.py,内容如下:
# 定义你的变量字典 devs = { 'hot_water': object(), 'air': object() } procs = { 'clean_keg': lambda x: 'do_something' } # 把字典里的每个键值对单独加到全局作用域(这样你直接敲hot_water就能用) globals().update(devs) globals().update(procs) # 同时也保留字典本身(方便直接操作devs、procs) globals()['devs'] = devs globals()['procs'] = procs
- 启动shell_plus时指定这个脚本:
python manage.py shell_plus --startup shell_startup.py
这样启动后,shell_plus原本的settings、所有模型都会自动加载,你的hot_water、air、clean_keg这些变量也直接能用,devs和procs字典也在环境里。
方法二:通过settings配置预导入(更持久)
如果不想每次启动都加--startup参数,可以在Django的settings.py里配置预导入,让shell_plus每次启动都自动加载你的变量。
- 先在项目里创建一个存放自定义变量的模块,比如
my_shell_vars.py,内容和上面的启动脚本类似:
devs = { 'hot_water': object(), 'air': object() } procs = { 'clean_keg': lambda x: 'do_something' } # 注入字典内的键值对到全局 globals().update(devs) globals().update(procs)
- 在settings.py里添加配置:
SHELL_PLUS_PRE_IMPORTS = [ # 导入整个模块的内容,这样变量会直接进入环境 ('my_shell_vars', '*'), ]
之后每次启动python manage.py shell_plus,你的变量都会自动加载,完全不用额外操作。
额外说明:你之前的冗余代码可以去掉啦
你之前手动构建的model_map完全是多余的——shell_plus已经自动帮你导入了所有Django模型(直接用模型类名就能访问),而且settings、Django的核心模块也都已经加载好了,用上面的方法就能直接复用这些现成的环境,不用自己再手动处理。
备注:内容来源于stack exchange,提问作者Lord Elrond
相关产品推荐
相关产品推荐

