如何在Flask中不使用JS获取不同随机图片?解决重复问题
解决Flask随机图片接口重复加载同一张的问题
这个问题我之前也碰到过!核心原因就是浏览器的缓存机制:当多个<img>标签用同一个/rnd URL时,浏览器会偷懒只发一次请求,之后所有相同URL的请求直接复用缓存结果,所以才会出现所有图片都一样的情况。既然不想改前端JS,咱们从后端动手就能解决,下面给你两个可行方案:
方案1:强制浏览器不缓存/rnd的响应
这是最直接的办法,只需要修改views.py里的接口函数,给响应加上缓存控制头,告诉浏览器"别存这个请求的结果,每次都重新问我要":
@app.route("/rnd", methods=["GET"]) def get_random_img(): image = random.choice(images) full_path = "static/img/b/" + image # 先获取send_file返回的响应对象 response = send_file(full_path) # 添加缓存禁止的响应头 response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "0" return response
加上这几个头之后,浏览器每次加载<img src="/rnd">时,都会老老实实给服务器发新请求,后端每次返回不同的随机图,问题就解决了。
方案2:理解robohash的思路(拓展参考)
你提到的robohash,它的核心思路是让每个请求的URL唯一——比如不同的路径片段、查询参数,浏览器会把这些当成不同的资源,自然不会复用缓存。但你不想改前端JS的话,没法给每个<img>自动加不同参数,所以这个思路没法直接套用。不过如果之后允许改前端的话,可以给/rnd加个随机参数(比如/rnd?t=xxx,后端忽略这个参数就行),也能达到同样的效果。
但回到你的需求,方案1完全不需要动前端代码,改完后端就能生效,是最优解。
内容的提问来源于stack exchange,提问作者tbzk
相关产品推荐
相关产品推荐

