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

部署Google Cloud的Flask REST API:GET/POST报错,PUT正常

Flask部署Google Cloud后GET/POST端点失效排查与修复

问题现象

本地测试时所有Flask REST API端点正常,部署到Google Cloud App Engine后:

  • GET /user/get_profile返回400错误
  • POST /user/sign_up返回500错误
  • 两个PUT端点(/user/login、/user/logout)可正常运行,说明数据库连接无问题

核心错误原因

1. GET端点400错误的根源

HTTP规范中,GET请求不应该携带JSON请求体,Google Cloud App Engine等生产环境服务器会直接拒绝包含JSON body的GET请求,导致Flask的request.get_json()返回None。后续代码判断"email" in data时,因data为None触发类型错误,最终被Flask框架捕获并返回400错误(而非代码中定义的401)。

2. POST端点500错误的根源

sign_up函数中,使用single().execute()查询用户时,若目标邮箱未注册,Supabase会抛出NotFoundError异常。代码未对该异常进行捕获,导致Flask返回500服务器内部错误。

修复方案

修复GET端点:改用URL查询参数传递数据

遵循HTTP规范,GET请求的参数通过URL查询字符串传递,修改代码如下:

@app.route("/user/get_profile", methods=["GET"])
def get_profile():
    email = request.args.get("email")
 
    if email:
        user = supabase.table("User Subscriptions").select("*").eq("email", email).single().execute()
        return jsonify(user.data)
    else:
        return Response('{"message": "Email is required"}', status=401)

对应的测试代码同步调整为传递查询参数:

# 原GET请求代码修改为
response = requests.get(BASE + "user/get_profile", params={"email": "hie@gmail.com"})

修复POST端点:捕获Supabase异常

在查询用户是否存在的逻辑中,添加异常捕获,处理用户未找到的场景:

from supabase.exceptions import NotFoundError

@app.route("/user/sign_up", methods=["POST"])
def sign_up():
    '''Remember to block people from signing up using the same email.'''
    data = request.get_json()

    # Check if email is inputted
    if "email" in data:
        email = data["email"]
    else:
        return Response('{"message": "Email is required"}', status=401)

    # If user is already signed up (check using email), reject
    try:
        user = supabase.table("User Subscriptions").select("*").eq("email", email).single().execute()
        return Response('{"message": "User already exists"}', status=401)
    except NotFoundError:
        # 用户不存在,执行注册逻辑
        newUser = {
            "email": email,
            "subscription_level": "basic",
            "remaining_tokens": 10000,
            "theme": "light",
            "logged_in": False
        }
        supabase.table("User Subscriptions").insert(newUser).execute()
        return Response('{"message": "Sign up successful"}')

额外优化:全局异常处理(可选)

添加全局异常处理器,避免单个端点重复编写异常捕获逻辑:

from flask import jsonify

@app.errorhandler(NotFoundError)
def handle_not_found(error):
    return jsonify({"message": "Resource not found"}), 404

@app.errorhandler(400)
def handle_bad_request(error):
    return jsonify({"message": "Invalid request format"}), 400

内容的提问来源于stack exchange,提问作者Chubbyman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:24:12