Django-在连接数据库之前渲染HTTP

时间:2019-07-10 21:02:15

标签: django

我有一个无服务器的数据库集群,它在不使用时会旋转。冷启动大约需要一分钟,在此期间django会等待并等待将HTTP请求对象发回。

在编写复杂代码之前,我正在寻找有关现有中间件/信号集成的建议,这些建议将允许我在django尝试获取数据库连接时呈现一个临时视图(例如,如果数据库查询花费的时间长于一秒钟完成,改为呈现到该视图。)

2 个答案:

答案 0 :(得分:2)

您可以创建一个自定义中间件,该中间件将针对每个请求测试数据库连接。请记住,这将尝试在每个请求上创建一个新的数据库连接

from django.db import connection
from django.db.utils import OperationalError
from django.shortcuts import render_to_response

def db_is_up_middleware(get_response):

    def middleware(request):
        try:
            c = connection.cursor()
        except OperationalError:
            return render_to_response('your_template.html')
        else:
            return get_response(request)

    return middleware

答案 1 :(得分:0)

部分解决方案:

  • 我将RESTful网关的查询超时减少到3秒。在超时结束时,我返回504错误,并显示一条不错的消息,告诉用户服务器已进入睡眠状态,但很快就会重新启动。在504错误的text / html响应中,我包含了一个刷新元标记,因此浏览器将自动尝试重新加载视图。

  • 我从面向公众的站点上撤下了所有数据库调用,并将它们置于身份验证层后面。这意味着认证将是最有可能超时的步骤,并且用户(我希望)在收到上述504错误后自然会尝试重新认证。

  • 我在document.ready()中添加了一个AJAX jQuery调用以提取随机数据库记录。该查询将超时,并且将不会发生任何事情(按预期方式)。每当用户点击面向公众的页面时,它将强制数据库服务器立即开始启动。