Django中处理出错页面的方法


Posted in Python onJuly 15, 2015

花几分钟时间欣赏一下我们写好的Web应用程序,然后我们再来搞点小破坏。 我们故意在 views.py 文件中引入一项 Python 错误,注释掉 hours_ahead 视图中的 offset = int(offset) 一行。

def hours_ahead(request, offset):
  # try:
  #   offset = int(offset)
  # except ValueError:
  #   raise Http404()
  dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
  html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
  return HttpResponse(html)

启动开发服务器,然后访问 /time/plus/3/ 。你会看到一个包含大量信息的出错页,最上面 的一条 TypeError 信息是: "unsupported type for timedelta hours component:  unicode" .

怎么回事呢? 是的, datetime.timedelta 函数要求 hours 参数必须为整型, 而我们注释掉了将 offset 转为整型的代码。 这样导致 datetime.timedelta 弹出 TypeError 异常。

这个例子是为了展示 Django 的出错页面。 我们来花些时间看一看这个出错页,了解一下其中 给出了哪些信息。

以下是值得注意的一些要点:

  •     在页面顶部,你可以得到关键的异常信息: 异常数据类型、异常的参数 (如本例中的 "unsupported type" )、在哪个文件中引发了异常、出错的行号等等。
  •     在关键异常信息下方,该页面显示了对该异常的完整 Python 追踪信息。 这类似于你在 Python 命令行解释器中获得的追溯信息,只不过后者更具交互性。 对栈中的每一帧,Django 均显示了其文件名、函数或方法名、行号及该行源代码。
  •     点击该行代码 (以深灰色显示),你可以看到出错行的前后几行,从而得知相关上下文情况。
  •     点击栈中的任何一帧的“Local vars”可以看到一个所有局部变量的列表,以及在出错 那一帧时它们的值。 这些调试信息相当有用。
  •     注意“Traceback”下面的“Switch to copy-and-paste view”文字。 点击这些字,追溯会 切换另一个视图,它让你很容易地复制和粘贴这些内容。 当你想同其他人分享这些异常 追溯以获得技术支持时(比如在 Django 的 IRC 聊天室或邮件列表中),可以使用它。
  •     你按一下下面的“Share this traceback on a public Web site”按钮,它将会完成这项工作。 点击它以传回追溯信息至http://www.dpaste.com/,在那里你可以得到一个单独的URL并与其他人分享你的追溯信息。
  •     接下来的“Request information”部分包含了有关产生错误的 Web 请求的大量信息: GET 和 POST、cookie 值、元数据(象 CGI 头)。 在附录H里给出了request的对象的 完整参考。
  •     Request信息的下面,“Settings”列出了 Django 使用的具体配置信息。 (我们已经提及过ROOT_URLCONF,接下来我们将向你展示各式的Django设置。 附录D覆盖了所有可用的设置。)

Django 的出错页某些情况下有能力显示更多的信息,比如模板语法错误。 我们讨论 Django 模板系统时再说它们。 现在,取消 offset = int(offset) 这行的注释,让它重新正常 工作。

不知道你是不是那种使用小心放置的 print 语句来帮助调试的程序员? 你其实可以用 Django 出错页来做这些,而不用 print 语句。 在你视图的任何位置,临时插入一个 assert False 来触发出错页。 然后,你就可以看到局部变量和程序语句了。 这里有个使用hours_ahead视图的例子:

def hours_ahead(request, offset):
  try:
    offset = int(offset)
  except ValueError:
    raise Http404()
  dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
  assert False
  html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
  return HttpResponse(html)

最后,很显然这些信息很多是敏感的,它暴露了你 Python 代码的内部结构以及 Django 配置,在 Internet 上公开这信息是很愚蠢的。 不怀好意的人会尝试使用它攻击你的 Web 应用程序,做些下流之事。 因此,Django 出错信息仅在 debug 模式下才会显现。 我们稍后 说明如何禁用 debug 模式。 现在,你只要知道 Django 服务器在你开启它时默认运行在 debug 模式就行了。 (听起来很熟悉? 页面没有发现错误,如前所述,工作正常。)

Python 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
详解Python3中yield生成器的用法
Aug 20 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
Python ellipsis 的用法详解
Nov 20 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
Feb 19 Python
发工资啦!教你用Python实现邮箱自动群发工资条
May 10 Python
在Django中创建动态视图的教程
Jul 15 #Python
Python的Django框架中的URL配置与松耦合
Jul 15 #Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 #Python
在Django中创建第一个静态视图
Jul 15 #Python
开始着手第一个Django项目
Jul 15 #Python
Python的Django框架可适配的各种数据库介绍
Jul 15 #Python
Python的Django框架安装全攻略
Jul 15 #Python
You might like
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PHP pear安装配置教程
2016/05/14 PHP
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
python 正则表达式 概述及常用字符
2009/05/04 Python
python实现代理服务功能实例
2013/11/15 Python
python代码实现ID3决策树算法
2017/12/20 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
介绍一下linux文件系统分配策略
2013/02/25 面试题
办公文员的工作岗位职责
2013/11/12 职场文书
如何写好建议书
2014/03/13 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
详解python的异常捕获
2022/03/03 Python
德生2P3收音机开箱评测
2022/04/30 无线电
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers