如何在django中设置数据库连接的超时时间

10 django

我有mysql数据库作为django的引擎.Django通过fastcgi工作认为nginx在1分钟内超时(之后nginx说"504网关超时").

如果数据库关闭,django正在尝试重新连接到DB并等待它的响应.等待响应时间太长(超过1分钟),nginx返回客户端504错误代码.

如何在django中设置db connecton的超时?以及正确的方式处理此事件并返回客户端一个漂亮的页面"抱歉数据库现在停止服务.请稍后再试"而不是技术504错误页面?

lem*_*nad 19

您可以使用设置的OPTIONS字典DATABASES.

选项名称取决于您的数据库后端,但对于PostgreSQL,它将是connect_timeout:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        …
        'OPTIONS': {
            'connect_timeout': 5,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 自Django 1.2以来,"DATABASE_OPTIONS"似乎被改为"OPTIONS"(https://docs.djangoproject.com/en/1.9/releases/1.2/) (4认同)
  • “connect_timeout”似乎也已经过时了,至少对于 Django1.9 来说是这样。只是接受“超时”,我希望它是正确的替换。 (2认同)
  • @zeycus`connect_timeout`是Postgres的正确选项。如果使用`timeout',则psycopg2 2.7.3.2出现“无效的连接选项”错误。Django文档仅针对Sqlite用户提及“超时”。 (2认同)

Ale*_*lli 5

DATABASE_OPTIONSin settings.py是一个额外关键字args的字典,它被传递给connect任何正在使用的数据库模块的方法; 根据MySqlDB的文档,正如另一个答案所说connect,这个connect_timeout值确实是你想要的(之前我错了,后者因后端而异 - 例如,timeout如果你的后端是SQLite ,它会拼写错误).

对于自定义错误页面,您可以按照Django文档中关于编写自己的异常中间件的建议(我确定简单的异常中间件,只显示自定义页面可以在贡献的软件中找到,但它可能更快地推出自己的而不是搜索网络上的现有代码,你可能不得不调整该代码;-).