【问题标题】:Django how to redirect python import error to custom error pageDjango如何将python导入错误重定向到自定义错误页面
【发布时间】:2014-02-07 11:29:18
【问题描述】:

我需要将 django 'import error' 重定向到自定义错误页面。除了导入错误之外的所有其他错误正在重定向到自定义错误页面

已经在 DEBUG= False 浏览器中显示的错误是

Traceback (most recent call last):

 File "/usr/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 283, in run
  self.result = application(self.environ, self.start_response)

 File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 272, in __call__
  response = self.get_response(request)

 File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 169, in get_response
 response = self.handle_uncaught_exception(request, resolver, sys.exc_info())

 File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 214, in handle_uncaught_exception
if resolver.urlconf_module is None:

File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 274, in _get_urlconf_module
self._urlconf_module = import_module(self.urlconf_name)

File "/usr/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in   import_module
  __import__(name)

File "/project/backup/project/hg/rel0129/hg/src/customer_/../customer_/hg/urls.py", line 4, in <module>
from lostpassword.views import recaptcha, reset

File "/project/backup/project/hg/rel0129/hg/../customer_/hg/lostpassword/views.py", line 12, in <module>
from hg.utils.common import __render, __redirect
hg/utils/common.py", line 15, in <module>
from urllibwrapper import URLClient, ClientResponse

 ImportError: No module named urlwrapper

错误需要重定向到自定义错误页面

提前致谢

【问题讨论】:

  • 404 用于找不到页面。理想情况下,您需要500(或服务器错误)。为什么要指定404
  • 我的意思是自定义错误页面或django默认错误模板。
  • 导入异常是编程错误,而不是“正确的服务器,错误的 URL,抱歉!”错误。
  • 如果服务器没有在调试模式下运行,您已经收到了 500 错误页面。
  • 我不想更正这个错误需要在这个错误发生时显示一个错误模板..

标签: python django


【解决方案1】:

当出现导入错误时,Django 将已经向您显示错误页面;显示的错误页面取决于DEBUG 的值。

如果将DEBUG 设置为True,则会向您显示回溯和一些调试信息。

如果 DEBUGFalse,Django 会显示默认的 500 错误页面。您可以通过在模板目录的根目录中提供 500.html 页面或在根 URLConf 中提供 handler500 字符串来设置自定义 500 错误响应。

请参阅500 error view documentation

但是,您的项目中的导入错误可能会阻止正确配置 Django,并且将找不到自定义的 500 错误处理程序。有'too broken'这样的东西,提前导入异常就是这样的情况。然后,该异常完全绕过 Django 错误处理,而是下降到 WSGI 服务器级别。

在这种情况下,如果将DEBUG 设置为False,则会向用户显示默认的 500 错误消息,一条简单的文本消息:

发生服务器错误。请联系管理员。

请注意,较旧的 Django 版本(1.4 之前)即使关闭调试模式,内置服务器仍然可以显示导入异常的回溯,因为这些旧版本使用自己的简单 HTTP 服务器.

在这种情况下,您可以将您的 Django 服务器升级到 1.4 或更高版本,和/或不使用内置服务器。请改用正确的production deployment

【讨论】:

  • @tomjoy: 两种可能:导入错误导致 Django 无法完成项目的配置(因此它不知道模板根目录,也找不到 500.html 页面),或者您将 DEBUG 设置为 True。
  • @tomjoy:导入错误相当严重,当站点损坏时,您不能希望将站点部署到生产环境。
  • 有什么解决方案可以避免向用户显示导入错误页面并显示自定义错误页面?
  • @tomjoy:不部署一个根本坏掉的服务器?如果DEBUG 设置为False,则最终用户不会显示导入错误。
  • 但在部署时看不到任何配置错误。
【解决方案2】:

要引发自定义错误页面,您需要定义一个模板,然后将以下内容添加到您的 urls.py

handler500 = 'mysite.views.my_custom_error_view'

要查看更多信息(包括回溯 - 如果 DEBUG = False 不推荐),请查看 this answerDjango 500 message in custom template

更多信息在django docs

这个 server_error 视图应该足以满足 99% 的 Web 应用程序,但如果您想覆盖该视图,您可以在根 URLconf 中指定 handler500,如下所示:

handler500 = 'mysite.views.my_custom_error_view'

在幕后,Django 通过在根 URLconf 中查找 handler500 来确定 500 视图,如果您没有定义 django.views.defaults.server_error,则返回到 django.views.defaults.server_error

关于500 浏览量需要注意的一点:

如果DEBUG 设置为True(在您的设置模块中),那么您的500 视图将永远不会被使用,而是会显示回溯,并带有一些调试信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2015-08-01
    • 1970-01-01
    • 2014-07-23
    • 2022-10-12
    • 2013-01-07
    相关资源
    最近更新 更多