Flask返回经Windows认证获取的图片时出现迭代错误排查
解决Windows认证获取图片后返回响应的迭代错误
看起来你遇到的问题是Flask的send_file在处理BytesIO对象时,和Python2.7环境下的旧版本Werkzeug产生了兼容性问题,导致WSGI服务器尝试迭代响应对象时出错。既然已经验证图片内容本身没问题,我们可以换一种更直接的方式来返回响应:
from flask import make_response import requests from requests_ntlm import HttpNtlmAuth def sendImage(imagename): """ Takes image name as a parameter and get the file from the XYZ server after Windows Authentication and serve the image as a response """ username = USERNAME password = PASSWORD # 发送请求并先验证请求是否成功 r = requests.get(BASE_URL + str(imagename), auth=HttpNtlmAuth(username, password)) if r.status_code != 200: return f"Failed to retrieve image: HTTP {r.status_code}", r.status_code # 直接用图片字节构造响应对象 response = make_response(r.content) # 设置标准的图片MIME类型(image/jpeg比image/jpg更规范) response.headers["Content-Type"] = "image/jpeg" # 如果需要让浏览器直接显示而非下载,可添加这个头 # response.headers["Content-Disposition"] = 'inline; filename="{}"'.format(imagename) return response
为什么这个方法能解决问题?
错误提示'Response' object is not iterable,本质是旧版本Werkzeug在处理send_file返回的响应时,对BytesIO对象的迭代逻辑出现了兼容问题。而直接用make_response将原始图片字节包装成响应对象,完全绕开了send_file内部的文件类对象处理逻辑,更直接地符合WSGI规范。
另外我添加了状态码检查的逻辑,这样如果从XYZ服务器获取图片失败(比如404、500),你能得到明确的错误反馈,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Naman Sharma
相关产品推荐
相关产品推荐

