You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何获取类变量的最新更新值

问题根因

你的问题本质是两点:

  • 类变量是进程隔离的:Django/DRF 部署时默认启动多 worker 进程处理请求,p_request 运行的进程和处理 post 请求的进程是独立的,两个进程内的 ConnectTestAPI.result、ConnectTestAPI.orderNo 是完全独立的副本,你在 post 里修改的是另一个进程的变量值,当前运行 p_request 的进程根本感知不到。
  • 无限循环无休眠:你写的while True没有任何等待逻辑,会占满当前CPU核心,就算是同进程内的多线程场景,也会因为CPU被循环占满,导致处理post请求的线程拿不到调度资源,永远无法执行更新逻辑。

解决方案

你已经引入了Redis,直接用Redis存储需要跨进程共享的result和orderNo即可,同时给循环加休眠和超时机制避免卡死:

import json
import time
from django.http import HttpResponse
from rest_framework.views import APIView
import redis

# 建议把Redis连接抽成公共配置,避免重复初始化
outside_server = {"ip": "你的Redis地址", "port": "你的Redis端口"}
redis_conn = redis.StrictRedis(outside_server['ip'], outside_server['port'], decode_responses=True)

class ConnectTestAPI(APIView):
    def post(self, request):
        data = request.data
        # 把更新的值存入Redis,替代类变量
        redis_conn.set("api_result", data['result'])
        redis_conn.set("api_orderNo", data['orderNo'])
        print(redis_conn.get("api_result")) 
        print(redis_conn.get("api_orderNo"))
        return HttpResponse("ok")

    # 加静态方法装饰器,否则调用会报参数缺失错误
    @staticmethod
    def p_request(timeout=30): # 加超时时间,单位秒,避免无限等待
        data = {
            "a" : 1234,
            "b" : 5678
        }
        data = json.dumps(data, ensure_ascii=False).encode('utf-8')
        redis_conn.set("data_dict", data)
        
        # 先清空之前残留的旧值
        redis_conn.delete("api_result", "api_orderNo")
        
        start_time = time.time()
        while True:
            # 超时判断
            if time.time() - start_time > timeout:
                raise TimeoutError("等待接口回调超时")
            
            # 从Redis取共享值
            result = redis_conn.get("api_result")
            orderNo = redis_conn.get("api_orderNo")
            if result and orderNo and int(orderNo) != 0:
                # 取完把临时值清掉,避免影响下次请求
                redis_conn.delete("api_result", "api_orderNo")
                return result, int(orderNo)
            
            # 每次循环休眠100ms,降低CPU占用
            time.sleep(0.1)

额外说明

如果你的业务场景存在高并发请求,还可以给Redis的key加唯一请求标识,避免不同请求的结果互相覆盖。

内容的提问来源于stack exchange,提问作者Jo Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:27:01