【问题标题】:Django: how to properly handle a database connection errorDjango:如何正确处理数据库连接错误
【发布时间】:2012-06-07 11:00:00
【问题描述】:

我有一个桌面应用程序,它将 POST 请求发送到 django 应用程序存储结果的服务器。 DB服务器和Web服务器不在同一台机器上,有时会在很短的时间内丢失连接,但会导致某些请求出现连接错误:

OperationalError: (2003, "Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (110)")

在一个“正常”的网站上,我想你不会太担心:浏览器会显示一个 500 错误页面,访问者稍后会再试一次。 在我的情况下,丢失请求发布的信息不是一种选择,我想知道如何处理这个问题?我会尝试捕捉这个异常,等待连接恢复(延迟不是问题),然后继续该过程。但由于异常可能发生在代码中的任何地方,我有点不知道如何继续。

感谢您的建议。

【问题讨论】:

  • 桌面应用程序也是 Django 应用程序吗?如果不是,为什么这个问题被标记为 python/mysql/django?请详细说明客户端堆栈。
  • 没有桌面应用程序是使用本机代码 (C++) 构建的并且已经部署,在这方面无法再做任何事情(这肯定是一个更好的解决方案)。现在不可以在服务器上做点什么吗?
  • 好的,你说的是网络服务器 数据库连接,而不是桌面 网络服务器连接。明白了。
  • 是的,问题是网络服务器和数据库服务器之间的连接。抱歉,如果不清楚。

标签: python mysql django


【解决方案1】:

您可以在 yourproject/wsgi.py 中创建 your own WSGI application 来装饰 django 的 wsgi 应用程序。

如果您的 wsgi 应用程序装饰器没有从被装饰的应用程序中获得可接受的值,它可以等待一段时间,然后再试一次。

但实际上,您应该修复客户端。客户端不应期望 24/7 连接到工作服务器。在那之前,我不会把这个桌面客户端作为用户来推销。

【讨论】:

    【解决方案2】:

    您可以使用带有 process_view 方法和 try / 的中间件,除了包装您的调用。

    或者你可以装饰你的视图并在那里结束调用。

    或者您可以将基于类的视图与在其调度方法上具有方法装饰器的基类一起使用,或者使用 overriden.dispatch。

    真的,你有很多解决方案。

    现在,如上所述,您可能也想修改您的桌面应用程序!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多