如何使用Django在请求之间持久化数据

2024-05-14 04:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序正在Kubernetes集群中运行,我想为它实现一个预停止钩子。这里的想法是,无论何时调用prestop钩子,pod/容器都将无法通过就绪探测检查,因此在被集群关闭之前,它不会收到任何新请求。在这种情况下,readiness probe和prestop钩子都是my app:/readiness和/prestop中的api端点

此外,为了使准备就绪探测失败,每当调用/ready时,我必须返回高于400的代码

所以我的问题是,我如何存储一个状态,该状态表示在调用prestop钩子之后,我应该在准备就绪探测中返回400?。请注意,我应该只为调用prestop hook的pod返回400,其他pod/容器应该继续正常工作。因此,我正在寻找一种跟踪单个吊舱/集装箱状态的方法

我做了一个非常愚蠢的测试,看看是否可以在请求之间保持计数器的状态:

class ReadinessProbeView(View):
    def __init__(self):
        self.count = 0

    def get(self, request):
        result = {}

        self.count = self.count + 1
        result["healthy"] = True
        result["count"] = self.count
        return JsonResponse(result, status=200)

但是,无论我调用这个函数多少次,count = 1,因此请求之间的状态都不会被维护


Tags: djangoself应用程序状态defcount集群result
2条回答

有很多不同的解决方案。 根据您的数据大小,您可以将数据存储在sessions对象、apps对象中,甚至可以打开一个小数据库,如sqlite或内存结构,如redis,就像这些家伙所做的那样:

Django: how to store a lot of data between requests if I don't have a database

以下是访问会话数据的入门指南:

https://docs.djangoproject.com/en/3.0/topics/http/sessions/

我遵照@coderanger的建议,使用了一个全局变量。我的准备就绪探测器正在按预期工作

以下是我更新的示例:

count = 0
class ReadinessProbeView(View):
    def get(self, request):
        result = {}

        global count
        count = count + 1
        result["healthy"] = True
        result["count"] = count
        return JsonResponse(result, status=200)

相关问题 更多 >