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

导语

如果在日常开发中有些模块需要在反复运行调试,但是又依赖了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
  • 然后,只要在项目的根路径下(即跟manage.py相同的目录下),执行该脚本+对应的python脚本的相对路径即可, 例如 ./django_debug.sh apps/example/task.py 这样一来,调试起来是不是简单很多了呢~

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

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

编辑于

jimbochen的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

Windows环境配置Apache+Mysql+PHP

一、安装配置Apache2.4.7(httpd-2.4.7-win64-VC11.zip ) 1、解压下载的安装包:httpd-2.4.7-...

31611
来自专栏云计算教程系列

如何在CentOS 7安装网页服务器(LNMP)

LNMP是一组可用于为动态网页和Web应用程序提供服务的软件。这是一个描述Linux操作系统的首字母缩略词,带有Nginx Web服务器。后端数据存储在MySQ...

1134
来自专栏jojo的技术小屋

原 WampServer的安装和配置

作者:汪娇娇 时间:2017年9月19日 php文件怎么调试?借助外在服务器是必须的,今天我就为大家介绍一个我用的工具:WampServer。 WampServ...

3078
来自专栏DannyHoo的专栏

利用终端进行自动打包--Xcodebuild

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

772
来自专栏WindCoder

Tomcat设置虚拟目录

在tomcat文件夹的conf\catalina\localhost(对于Tomcat6版本及其以上,需要自己创建catalina和localhost这两个文件...

641
来自专栏三丰SanFeng

zookeeper的python客户端安装

项目中使用了python,需要使用到zookeeper的功能,这里记录一下安装过程。 内核版本:2.6.32 发行版:CentOs-6.6 64bit 1、由于...

1998
来自专栏pangguoming

centos7.2使用rpm安装jdk8

842
来自专栏散尽浮华

分布式监控系统Zabbix--完整安装记录 -添加apache监控

前面介绍了zabbix3.0.3环境及相关监控项的添加,下面介绍下针对apache的监控配置: 1)在apache配置文件中打开server-status状态访...

20210
来自专栏jojo的技术小屋

原 WampServer的安装和配置

1253
来自专栏生信宝典

ssh免密码登录远程服务器

最简单的操作 ssh免密码登录的原理是把本地电脑的公钥放在宿主机,然后使用本地电脑的私钥去认证。 在本地电脑执行 /usr/bin/ssh-keygen -t ...

2366

扫码关注云+社区