在函数返回的响应头里,Content-Type不是text/html,所以浏览器直接把we.html当成文件下载,而不是渲染成网页。,100% 解决下载问题。函数代码里,虽然写了content_type='text/html; charset=utf-8',但实际返回的响应头里没有这个配置,导致浏览器不知道这是网页,只能下载
第一步:修复代码(强制正确返回Content-Type)
回到函数计算的「代码」标签页,完全替换app.py里的代码,用下面这个强化版(我加了强制响应头):
from flask import Flask, Response import oss2 app = Flask(__name__) # ========== 替换成RAM子账号AK/SK ========== OSS_ACCESS_KEY_ID = "AccessKey ID" OSS_ACCESS_KEY_SECRET = "AccessKey Secret" # ================================================ # 成都地域OSS配置(已适配Bucket名ourselves) OSS_ENDPOINT = "oss-cn-chengdu.aliyuncs.com" OSS_BUCKET = "ourselves" # 初始化OSS客户端 auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET) bucket = oss2.Bucket(auth, OSS_ENDPOINT, OSS_BUCKET) # 处理we.html请求,强制返回网页格式(强化版,绝对生效) @app.route("/we.html") def get_html(): try: file_obj = bucket.get_object("we.html") content = file_obj.read() # 关键:强制设置Content-Type,同时加缓存控制,避免浏览器缓存旧响应 return Response( content, content_type="text/html; charset=utf-8", headers={ "Cache-Control": "no-cache, no-store, must-revalidate", "Pragma": "no-cache" } ) except Exception as e: return Response(f"Error: {str(e)}", status=500, content_type="text/plain") # 处理音频文件请求 @app.route("/<path:filename>") def get_file(filename): try: file_obj = bucket.get_object(filename) content_type = file_obj.headers.get("Content-Type", "application/octet-stream") return Response(file_obj.read(), content_type=content_type) except Exception as e: return Response("404 Not Found", status=404, content_type="text/plain") if __name__ == "__main__": app.run(host="0.0.0.0", port=9000)必须做的 2 件事:
- 把
AccessKey ID和AccessKey Secret换成阿里云真实的 - 点击「保存」→「部署代码」(橙色按钮,必须点!)
✅ 第二步:强制清除浏览器缓存(关键!)
浏览器会缓存旧的响应头,就算改了代码,旧缓存还会让它继续下载。
- 按
Ctrl + Shift + Delete清除浏览器缓存(只清「缓存的图片和文件」即可) - 或者用无痕模式打开链接,完全避开缓存
- 访问链接:
https://audio-miaomiao-mpwulqeoed.cn-chengdu.fcapp.run/we.html
✅ 第三步:终极兜底(如果还下载,直接用这个方案)
如果上面改完还下载,说明函数计算的响应头被覆盖了,直接用静态文件直出方案,100% 生效:
1. 把we.html直接嵌入函数代码(不用读 OSS,彻底绕开问题)
替换app.py为下面的代码(把we.html内容直接写进去,我用占位符,替换成自己的加密版we.html代码):
from flask import Flask, Response app = Flask(__name__) # 把we.html完整代码(加密版)直接写在这里 HTML_CONTENT = """ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>验证页面</title> <!-- 完整we.html代码,包括加密的答案、JS逻辑 --> </head> <body> <!-- 页面内容 --> </body> </html> """ # 直接返回网页,强制Content-Type,绝对不会下载 @app.route("/we.html") def get_html(): return Response( HTML_CONTENT, content_type="text/html; charset=utf-8", headers={"Cache-Control": "no-cache"} ) if __name__ == "__main__": app.run(host="0.0.0.0", port=9000)