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

相关文章

来自专栏机器学习原理

mysql数据库安装和使用

1264
来自专栏CaiRui

Mysql-13mysql的复制

1.mysql复制概念   指将主数据库的DDL和DML操作通过二进制日志传到复制服务器上,然后在复制服务器上将这些日志文件重新执行,从而使复制服务器和主服务器...

1776
来自专栏乐沙弥的世界

基于Linux下 Oracle 备份策略(RMAN)

对于 Oracle 数据库的备份与恢复,尽管存在热备,冷备以及逻辑备份之外,使用最多的莫过于使用RMAN进行备份与恢复。而制定RMAN备份策

572
来自专栏Laoqi's Linux运维专列

Redis慢日志+扩展模块+存储session+主从配置

3855
来自专栏Laoqi's Linux运维专列

使用mysql-proxy配置mysql读写分离

3328
来自专栏Web 开发

给Twentyfifteen提速

Twentyfifteen默认加载了Google Fonts,但国内的这大局网,会导致无法加载,从而影响整个阻塞整个页面的渲染。

730
来自专栏lgp20151222

mysql导入导出sql文件

1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname > db...

681
来自专栏Java开发

Linux开启MySQL日志

694
来自专栏蓝天

MySQL导出导入命令的用例

  mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

794
来自专栏周奇的专栏

tungsten replicator:数据迁移利器【mysql 数据同步到 mongodb】

tungsten-replicator 是一款开源的、高性能、跨数据库系统的复制引擎,可用作多种场景下的数据迁移组件。本文尝试利用该工具实现 mysql 数据到...

7490

扫码关注云+社区