Google Cloud converse_conversation返回空值/None的Flask报错排查
Flask对接Google Cloud Discovery Engine v1返回None引发视图函数错误
问题描述
我使用Flask框架对接Google Cloud discoveryengine_v1服务,尝试发起新的对话请求。从官方示例代码修改后测试时,出现类型错误,提示视图函数未返回有效响应(函数返回None或无return语句)。
代码实现
from flask import Flask, jsonify, request from google.cloud import discoveryengine_v1 @app.route("/new", methods=['POST']) def new_question(): api_data = request.get_json() answer_response = sample_converse_conversation(api_data['question']) # api_data['question'] 是字符串类型 print(answer_response) return answer_response def sample_converse_conversation(question): try: # 创建客户端 client = discoveryengine_v1.ConversationalSearchServiceClient() # 初始化请求参数 request = discoveryengine_v1.ConverseConversationRequest( name="<name value>", # 已移除具体值,但包含项目详情 ) # 发起请求 response = client.converse_conversation(request=request) # 处理响应 return response except Exception as e: print(e)
报错信息
Traceback (most recent call last): File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1478, in __call__ return self.wsgi_app(environ, start_response) File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1458, in wsgi_app response = self.handle_exception(e) File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask_cors\extension.py", line 176, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1455, in wsgi_app response = self.full_dispatch_request() File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 869, in full_dispatch_request rv = self.handle_user_exception(e) File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask_cors\extension.py", line 176, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 867, in full_dispatch_request rv = self.dispatch_request() File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 852, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask_cors\decorator.py", line 130, in wrapped_function resp = make_response(f(*args, **kwargs)) File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\helpers.py", line 175, in make_response return current_app.make_response(args) # type: ignore File "C:\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1161, in make_response raise TypeError(TypeError: The view function for 'new_question' did not return a valid response. The function either returned None or ended without a return statement.
后端目录结构

问题原因及解决方法
1. 异常分支未返回值
sample_converse_conversation函数的except块仅打印异常信息,未返回任何内容。一旦Google Cloud API调用触发异常,函数会返回None,导致Flask视图函数new_question返回无效值,触发报错。
修复代码:
except Exception as e: print(e) return {"error": str(e)}, 500
2. API请求未传入用户问题
构建ConverseConversationRequest时,仅指定了name参数,未将传入的question加入请求中。Google Cloud API因缺少必要参数可能返回异常,最终导致函数返回None。
修复代码:
request = discoveryengine_v1.ConverseConversationRequest( name="<name value>", query=discoveryengine_v1.TextInput(text=question) )
3. Flask无法直接序列化Google API响应对象
即使API调用成功,直接返回Google的protobuf响应对象,Flask无法将其转换为有效的HTTP响应,也可能引发错误。
修复代码:
先导入依赖:
from google.protobuf.json_format import message_to_json import json
然后修改响应返回逻辑:
# 在sample_converse_conversation函数中 return json.loads(message_to_json(response))
或者在视图函数中用jsonify包装:
@app.route("/new", methods=['POST']) def new_question(): api_data = request.get_json() answer_response = sample_converse_conversation(api_data['question']) print(answer_response) return jsonify(answer_response)
4. 验证Google Cloud认证配置
确保本地环境已配置Google Cloud认证,比如设置GOOGLE_APPLICATION_CREDENTIALS环境变量指向服务账号密钥文件,否则API调用会失败,触发异常分支返回None。
内容的提问来源于stack exchange,提问作者Sophia De Leon
相关产品推荐
相关产品推荐

