在命令行中调试 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 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

WSO2 ESB(1)

什么是WSO2 ESB? WSO2 ESB是一个轻量级的易于使用的企业服务资源总线。WSO2 ESB允许系统管理员和SOA架构师,消息路由,虚拟化,中介,转换,...

3404
来自专栏小勇DW3

MySql数据库实现分布式的主从结构

最近学习了关于使用MySql数据的实现主动结构的原理,在以前的并发访问低的场景一下,一般一台性能高的服务器作为一个MySql数据,就可以满足业务的增删改查场景,...

1395
来自专栏pangguoming

MySql 5.7安装(随机密码,修改默认密码)两个坑

1343
来自专栏C/C++基础

Linux命令(24)——mv命令

mv命令用来为文件或目录改名,或将文件或目录移入其它位置。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。

1221
来自专栏技术专栏

centos 部署spring boot应用

1113
来自专栏帅小子的日常

sso系统使用

1243
来自专栏xingoo, 一个梦想做发明家的程序员

Tomcat 6 JNDI数据源详解

数据库连接池这个概念应该都不陌生,在Java中连接池也就是数据库的连接池,它是一种采用连接复用的思想避免多次连接造成资源的浪费机制。 最常见的连接池就是DB...

2049
来自专栏应用案例

SSM框架搭建

ssm框架的学习小结,主要是初期环境的搭建配置以及信息的交互处理过程,非技术人员请绕道~ SpringMVC其实就是Spring框架的一个模块,是一个基于MVC...

35710
来自专栏FreeBuf

weblogic安全配置二三事

*本文原创作者:shewey,本文属FreeBuf原创奖励计划,未经许可禁止转载 1、引言 前段时间Java的反序列化漏洞吵得沸沸扬扬,因工作原因需要对webl...

3085
来自专栏企鹅号快讯

Spring、Spring MVC、MyBatis 整合文件配置详解

使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了。先总结一下SSM整合的文件配置。其实具体的用法最好还是看官方文档。 Spring:http://sp...

1846

扫码关注云+社区