Vercel部署Flask+React项目:POST请求被识别为GET的问题排查
问题分析与解决方案
一、POST请求被识别为GET且返回404的核心原因
Vercel部署Python/Flask后端需要正确配置路由规则,否则会出现路由不匹配、请求被重定向为GET的问题:
- 默认情况下,Vercel会优先处理静态文件,若未正确配置后端路由,请求会被解析为静态资源请求,最终返回404且请求方法被篡改。
- Flask的路由在Vercel上需要通过
vercel.json明确映射,否则Vercel无法正确转发请求到Flask应用。
解决步骤:
- 在项目根目录创建
vercel.json文件,配置路由重写规则:
{ "rewrites": [ { "source": "/(.*)", "destination": "/api/index.py" } ] }
注:如果你的Flask入口文件是app.py,就把destination改成/api/app.py,确保后端代码放在api目录下(Vercel对Python后端的默认目录要求)。
- 检查前端请求URL的路径:
确保VITE_BACKEND_URL末尾没有多余斜杠,拼接后的路径为https://xxx.vercel.app/contact,避免路径错误导致重定向。可以修改Axios请求代码,用模板字符串拼接更稳妥:
const resp = await axios.post(`${import.meta.env.VITE_BACKEND_URL}/contact`, { email, message }, config)
二、Postman请求返回401的原因及解决
401错误来自Gmail SMTP的认证失败,和Vercel的JWT无关(Vercel不会默认要求JWT授权),具体原因:
- 若你的Gmail开启了2步验证,使用普通密码无法登录SMTP服务,必须用应用专用密码。
- Vercel上的环境变量配置错误,
EMAIL_SENDER或EMAIL_PASSWORD未正确注入,导致SMTP登录失败。
解决步骤:
- 生成Gmail应用专用密码:
- 登录Google账号进入「安全」设置,确认开启2步验证。
- 找到「应用专用密码」,生成一个用于SMTP的密码,替换当前的
EMAIL_PASSWORD。
- 修正Vercel环境变量:
- 在Vercel项目的「Settings」→「Environment Variables」中添加
EMAIL_SENDER和EMAIL_PASSWORD,无需依赖本地.env文件(Vercel会自动注入这些变量,Flask中直接用os.getenv()即可)。
- 在Vercel项目的「Settings」→「Environment Variables」中添加
- 优化Flask中的SMTP错误处理:
添加try-except块捕获异常,方便排查问题:
try: with smtplib.SMTP(smtp_server, port) as server: server.ehlo() server.starttls(context=context) server.ehlo() server.login(EMAIL_SENDER, EMAIL_PASSWORD) server.send_message(msg) return "Message sent!", 200 except smtplib.SMTPAuthenticationError: return jsonify({"msg": "SMTP authentication failed"}), 401 except Exception as e: return jsonify({"msg": f"Error sending email: {str(e)}"}), 500
三、额外注意事项
- 去掉重复的CORS配置:你已经用了
CORS(app),又在before_request里处理OPTIONS请求,会导致CORS头重复,建议删除before_request中的CORS处理逻辑,只保留CORS(app)即可。 - 优化Flask的请求解析:如果前端发送的JSON格式有问题,
request.get_json()会返回None,建议添加判断:
req = request.get_json() if not req: return jsonify({"msg": "Invalid JSON data"}), 400 email = req.get('email') message = req.get('message')
避免因JSON解析失败导致的报错。
内容的提问来源于stack exchange,提问作者John Durtka
相关产品推荐
相关产品推荐

