部署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
相关产品推荐
相关产品推荐

