Django集成PRAW调用Reddit API时lru_cache导致可迭代数据不显示问题
问题原因
- 核心原因是
redditor.submissions.top(limit=10)返回的是PRAW提供的惰性生成器对象,这类对象仅支持一次遍历:第一次页面渲染时生成器的内容已经被全部读取耗尽,缓存中存储的是已经为空的生成器,后续从缓存读取时自然遍历不到任何内容。 - 次要注意点:
lru_cache装饰实例方法时会将self纳入缓存键计算,如果你后续会创建多个Reddit类实例,会导致缓存重复占用空间,不过你当前代码是全局单例实例化,该问题暂时不会触发。
修复方案
只需要修改reddit.py中details方法的返回逻辑,主动把生成器转为列表,将实际数据存入缓存即可:
from functools import lru_cache import praw CLIENT_ID = "你的客户端ID" CLIENT_SECRET = "你的客户端密钥" USER_AGENT = "你的UA" class Reddit: def __init__(self): self.praw = praw.Reddit( client_id = CLIENT_ID, client_secret = CLIENT_SECRET, user_agent = USER_AGENT ) @lru_cache(maxsize = 256) def details(self, redditor): redditor = self.praw.redditor(redditor) overview = { 'name': redditor.name, 'comment_karma': redditor.comment_karma, # 把生成器转成列表,实际数据会被缓存 'top_submissions': list(redditor.submissions.top(limit=10)), } return overview
修改后同一个redditor参数再次调用方法时,会直接返回缓存中的列表数据,不会重复发起API请求,同时列表支持多次遍历,模板渲染也不会出现无数据的问题。
内容的提问来源于stack exchange,提问作者user16751857
相关产品推荐
相关产品推荐

