如果在日常开发中有些模块需要在反复运行调试,但是又依赖了django框架的组件,需要启动框架后才能正常执行,放在views里用发起http调用不够简单方便,使用python manage.py shell
的话每次修改又得退出后重新进入才能生效,也是比较麻烦。
本文提供一个简单可行的方案简化了这个调试过程
其实用的主要也是python manage.py shell
这个工具。
先举个例子,文件路径为apps/example/task.py
,主要的代码如下
import pprint
from models import User
def get_user_info(id):
user = User.objects.filter(id==id).first()
pprint.pprint(user)
# 如果想要调试上面这个方法,一般会这么写
if __name__=='__main__':
get_user_info(1)
这样的话,直接运行起来会一般会报这样的错误
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
就是提示找不到对应的配置。因为此时框架的代码都没有启动,相应的全局配置都没有加载到,自然是用不了model的。
这个方案主要采用的还是python manage.py shell
这个工具,利用环境变量来判断是否要执行调试的代码。
settings.pyimport os os.environ['MODULE_DEBUG'] = 'off'
# 默认框架启动时初始化为off,即不启动
apps/example/task.py
改为import pprint
from models import User
def get_user_info(id):
user = User.objects.filter(id==id).first()
pprint.pprint(user)
# 这里的判断逻辑由原来的判断模块名改成判断MODULE_DEBUG这个开关是否开启
if os.environ['MODULE_DEBUG']=='on':
get_user_info(1)
python manage.py shell
这个工具就可以做一些事情了,只要执行以下命令就可以执行上述的apps/example/task.py
脚本啦echo "import os\nos.environ['MODULE_DEBUG']='on'\nimport apps.example.task"|python manage.py shell
通过管道命令的方式就可以直接在命令行里执行这几句python语句,通过改变了环境变量然后再引入需要调试的模块的方式,就可以不用启动框架执行相应的调试代码(其实python manage.py shell
还是有启动框架了,只是说这样可以直接一行命令执行而不用先进入python shell里再执行多次)
django_debug.py
#!/bin/bash
show_usage() {
echo "Usage: `basename` path/to/file"
}
if [ $# != 1 ]
then
show_usage
exit -1
fi
datetime=`date +%Y%m%d%H%i%s`
tmp_file="tmp_debug_python_script_$datetime.py"
script_path=$1
script_path=${script_path%\.py}
script_path=${script_path//\//.}
echo "import os" >> $tmp_file
echo "os.environ['MODULE_DEBUG']='on'" >> $tmp_file
echo "import $script_path">> $tmp_file
cat $tmp_file|python manage.py shell
rm $tmp_file
./django_debug.sh apps/example/task.py
这样一来,调试起来是不是简单很多了呢~原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。