簡體   English   中英

如何使用 Django 在請求之間持久化數據

[英]How to persist data between requests using Django

我有一個在 Kubernetes 集群中運行的 Django 應用程序,我想為它實現一個 prestop 鈎子。 這里的想法是,無論何時調用 prestop 鈎子,pod / 容器都將無法通過就緒探測檢查,因此它在被集群關閉之前不會收到任何新請求。 在這種情況下,readiness 探針和 prestop 鈎子都是我的應用程序中的 api 端點:/readiness 和 /prestop。

此外,為了使就緒探測失敗,每當調用 /readiness 時,我必須返回一個高於 400 的代碼。

所以我的問題是,如何在調用 prestop 鈎子后存儲一個狀態,表明我應該在就緒探測器中返回 400? 請注意,我應該只為調用了 prestop 鈎子的 pod 返回 400,其他 pods/容器應該繼續正常運行。 所以我正在尋找一種方法來跟蹤單個 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 ,因此在請求之間不會保持狀態。

對此有很多不同的解決方案。 根據您的數據大小,您可以將數據存儲在 session 對象、apps 對象中,甚至可以像這些人那樣打開一個小型數據庫,如 sqlite 或內存結構,例如 redis:

Django:如果我沒有數據庫,如何在請求之間存儲大量數據

以下是訪問會話數據的入門:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM