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

Django实现固定间隔API调用且保证界面响应的方案问询

解决Django看板Zendesk API调用频率过高+界面阻塞问题

你的核心问题在于把耗时的API调用和sleep放在了视图函数里,导致要么多进程下重复调用API超限,要么单线程下请求阻塞界面。下面是不用换框架、快速解决的方案:


核心思路

把Zendesk数据的获取和缓存从视图中剥离:用一个独立的后台进程定期拉取数据并存入缓存,视图只负责读取缓存并返回,这样既保证API调用频率固定,又让界面响应秒级完成。


步骤1:配置Django本地缓存

因为你的看板是内部使用,不需要分布式缓存,直接用Django自带的本地内存缓存即可。在settings.py中添加:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'zendesk-kpi-cache',  # 给缓存起个唯一名字,避免冲突
    }
}

步骤2:编写独立的KPI更新脚本

新建一个kpi_updater.py文件,专门负责定期拉取Zendesk数据并存入缓存:

from django.core.cache import cache
import time
# 导入你原有的Zendesk客户端和数据获取函数
from your_app.engine import ZenClient, get_infos

def update_zendesk_kpi():
    # 循环定期更新,间隔设为你要的1分15秒(75秒)
    while True:
        try:
            # 初始化Zendesk客户端
            client = ZenClient(("xxxxx","xxxxxx","xxxxxx"))
            # 获取KPI数据
            kpi_data = get_infos(client, "open", "pending", "new")
            # 把数据存入缓存,超时设为80秒(比更新间隔长5秒,避免缓存空窗)
            cache.set('zendesk_kpi', kpi_data, timeout=80)
            print(f"Updated KPI data at {time.ctime()}, next run in 75s")
        except Exception as e:
            # 捕获API异常,避免进程崩溃
            print(f"Failed to update KPI: {str(e)}")
        # 等待75秒再执行下一次
        time.sleep(75)

if __name__ == '__main__':
    # 启动前先加载Django环境
    import os
    import django
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
    django.setup()
    
    update_zendesk_kpi()

注意:把your_app和your_project换成你实际的应用和项目名称。

步骤3:修改视图,直接读取缓存返回

把原来的SiteNumberView改成从缓存取数据,彻底去掉耗时的API调用:

from django.core.cache import cache
from rest_framework.views import APIView
from rest_framework.response import Response

class SiteNumberView(APIView):
    def get(self, request, *args, **kwargs):
        # 从缓存读取数据,缓存没命中时返回默认值(避免前端报错)
        kpi_data = cache.get('zendesk_kpi', {'nb_new': '0'})
        return Response(kpi_data)

步骤4:启动服务

  1. 先开一个终端,启动KPI更新脚本:
    python kpi_updater.py
    
  2. 再开另一个终端,正常启动Django开发服务器:
    python manage.py runserver
    

为什么这个方案有效?

  • API调用频率完全可控:后台进程固定75秒调用一次Zendesk API,不管前端有多少请求,都不会触发额外的API调用,完美符合每分钟700次的限制。
  • 界面响应无阻塞:视图现在只做缓存读取和返回,耗时毫秒级,点击导航按钮、刷新页面都能立刻响应,再也不会出现等待脚本执行的情况。
  • 零框架更换:所有改动都基于Django自带工具,不需要引入Celery等复杂定时任务框架,快速落地。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:42:42