Gunicorn返回JPG/JPEG图片无法正常渲染该如何解决?
问题根因
你的代码存在3处直接导致图片加载失败的问题:
- 错误对图片做Base64编码:
image/jpeg响应要求返回原始JPEG二进制流,Base64编码仅适用于HTML内联图片(data:image/jpeg;base64,xxx格式)的场景,把编码后的内容当图片返回,浏览器无法识别为有效图片格式。 - 文件路径读取逻辑错误:请求的PATH_INFO是带前导斜杠的绝对路径(比如日志里的
/media/zombie1.jpeg),直接把这个值传给open()会从系统根目录开始查找文件,而非你项目的静态资源目录,大概率会触发文件不存在的IO错误,导致请求异常。 - 编码逻辑冗余混乱:自定义的
encode变量判断分支完全没必要,二进制图片内容不需要做UTF-8编码,字符串和bytes类型混用很容易触发类型错误。
修复方案
删掉无效的Base64编码逻辑,修正静态文件路径映射,补全基础的异常和安全校验,修改后的完整代码如下:
import os # 配置静态资源根目录,替换为你实际存放图片的文件夹绝对路径,示例为脚本同目录下的media文件夹 STATIC_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "media") def app(environ, start_response): req_path = environ.get("PATH_INFO", "") resp_body = b"" content_type = "text/html; charset=utf-8" status = "200 OK" # 匹配JPEG图片请求 if req_path.endswith((".jpeg", ".jpg")): content_type = "image/jpeg" # 拼接安全的本地文件路径,拦截路径穿越攻击 safe_path = os.path.normpath(os.path.join(STATIC_DIR, req_path.lstrip("/"))) if not safe_path.startswith(STATIC_DIR): status = "403 Forbidden" resp_body = b"403 Access Denied" elif not os.path.isfile(safe_path): status = "404 Not Found" resp_body = b"404 File Not Found" else: # 直接读取原始二进制内容,不做任何编码转换 with open(safe_path, "rb") as f: resp_body = f.read() else: # 处理HTML请求 context = {"path": req_path, "pageTitle": "home"} resp_body = template("template.html", context).encode("utf-8") response_headers = [ ("Content-Type", content_type), ("Content-Length", str(len(resp_body))) ] start_response(status, response_headers) return iter([resp_body])
验证注意事项
- 先确认
STATIC_DIR配置的路径和你实际存放JPEG文件的路径完全一致,比如请求/zombie1.jpeg对应读取STATIC_DIR/zombie1.jpeg,请求/media/zombie1.jpeg对应读取STATIC_DIR/media/zombie1.jpeg - 重启Gunicorn服务后刷新页面,在浏览器开发者工具的网络面板中查看图片请求:状态码为200、响应头Content-Type为
image/jpeg时,图片即可正常渲染。
内容的提问来源于stack exchange,提问作者jaycer
相关产品推荐
相关产品推荐

