You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vercel部署Flask+React项目:POST请求被识别为GET的问题排查

问题分析与解决方案

一、POST请求被识别为GET且返回404的核心原因

Vercel部署Python/Flask后端需要正确配置路由规则,否则会出现路由不匹配、请求被重定向为GET的问题:

  • 默认情况下,Vercel会优先处理静态文件,若未正确配置后端路由,请求会被解析为静态资源请求,最终返回404且请求方法被篡改。
  • Flask的路由在Vercel上需要通过vercel.json明确映射,否则Vercel无法正确转发请求到Flask应用。

解决步骤:

  1. 在项目根目录创建vercel.json文件,配置路由重写规则:
{
  "rewrites": [
    { "source": "/(.*)", "destination": "/api/index.py" }
  ]
}

注:如果你的Flask入口文件是app.py,就把destination改成/api/app.py,确保后端代码放在api目录下(Vercel对Python后端的默认目录要求)。

  1. 检查前端请求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登录失败。

解决步骤:

  1. 生成Gmail应用专用密码:
    • 登录Google账号进入「安全」设置,确认开启2步验证。
    • 找到「应用专用密码」,生成一个用于SMTP的密码,替换当前的EMAIL_PASSWORD。
  2. 修正Vercel环境变量:
    • 在Vercel项目的「Settings」→「Environment Variables」中添加EMAIL_SENDER和EMAIL_PASSWORD,无需依赖本地.env文件(Vercel会自动注入这些变量,Flask中直接用os.getenv()即可)。
  3. 优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:27:14