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:启动服务
- 先开一个终端,启动KPI更新脚本:
python kpi_updater.py - 再开另一个终端,正常启动Django开发服务器:
python manage.py runserver
为什么这个方案有效?
- API调用频率完全可控:后台进程固定75秒调用一次Zendesk API,不管前端有多少请求,都不会触发额外的API调用,完美符合每分钟700次的限制。
- 界面响应无阻塞:视图现在只做缓存读取和返回,耗时毫秒级,点击导航按钮、刷新页面都能立刻响应,再也不会出现等待脚本执行的情况。
- 零框架更换:所有改动都基于Django自带工具,不需要引入Celery等复杂定时任务框架,快速落地。
内容的提问来源于stack exchange,提问作者Shezmula
相关产品推荐
相关产品推荐

