前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在命令行中调试 django 项目中的模块方法

在命令行中调试 django 项目中的模块方法

原创
作者头像
jimbochen
修改2017-07-27 10:21:29
4.2K0
修改2017-07-27 10:21:29
举报
文章被收录于专栏:jimbochen的专栏jimbochen的专栏

导语

如果在日常开发中有些模块需要在反复运行调试,但是又依赖了django框架的组件,需要启动框架后才能正常执行,放在views里用发起http调用不够简单方便,使用python manage.py shell的话每次修改又得退出后重新进入才能生效,也是比较麻烦。 本文提供一个简单可行的方案简化了这个调试过程 其实用的主要也是python manage.py shell这个工具。

问题

先举个例子,文件路径为apps/example/task.py,主要的代码如下

代码语言:javascript
复制
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改为
代码语言:javascript
复制
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
代码语言:javascript
复制
#!/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
  • 然后,只要在项目的根路径下(即跟manage.py相同的目录下),执行该脚本+对应的python脚本的相对路径即可, 例如 ./django_debug.sh apps/example/task.py 这样一来,调试起来是不是简单很多了呢~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • 问题
  • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com