
[英]SendGrid email works locally but not on Azure app service
[英]Flask API works correctly locally but returns 415 on Azure App Service
requests
从 python 调用端点服务器的相关代码:
from flask import Flask, jsonify, request
from waitress import serve
from paste.translogger import TransLogger
# --- Routes definition --- #
@app.route(f"{API_ENDPOINT_PREFIX}/hello", methods=["GET"])
def hello():
logging.info("Hello")
return jsonify({"message": "Hello!"})
@app.route(f"{API_ENDPOINT_PREFIX}/filter/<tablename>", methods=["GET"])
def get_filter_options(tablename: str):
request_data = request.get_json()
logging.debug(f"Request data: {request_data}")
# Doing stuff here and obtaining a variable options
logging.info(f"Retrieved {len(options)} filter options for table '{tablename}'")
return jsonify({"filters": options})
# --- Main --- #
if __name__ == "__main__":
logging.info(f"Welcome to Flask server")
serve(
TransLogger(app, setup_console_handler=False),
host=API_ENDPOINT_HOST,
port=API_ENDPOINT_PORT,
)
API_ENDPOINT_PREFIX
设置为/api
。
请注意, /api/hello
是用于测试目的的端点,而/api/filter/<tablename>
应该是一个有效的 api,用于检索过滤器字段的可能选项并将它们返回给 ui。 这个 api 连接到托管在 Azure 上的 postgresql 数据库。
我在localhost:8000
上本地启动了这个,一切都按预期工作。 我还将相同的部署到 Azure 应用服务,发生的是/api/hello
端点仍然工作正常,而/api/filter/<tablename>
返回415 。
在这两种情况下,都使用以下代码片段调用 api:
header = {"Content-Type": "application/json", "Accept": "application/json"}
requests.get(
f"{BASE_API_URL}/filter/tablename",
data=json.dumps({"filters": {}}),
headers=header,
)
其中BASE_API_URL
或者http://localhost:8000/api
在本地运行时或http://app-service-name.azurewebsites.net/api
在应用程序服务上运行时。
一般建议说要包括Content-Type
和Accept
header,无论如何我都会这样做。 我还检查了应用程序服务和托管数据库之间的连接,假设如果这两个服务无法通信,可能会出现一些问题。 为此,我在应用服务上创建了一个服务连接器,其目标是托管数据库,所以我想一切正常。
在我看来奇怪的是,不需要任何负载的/api/hello
端点在两种环境中都能正常工作,而需要负载的api/filter/<tablename>
端点的工作方式不同。
我错过了什么吗? 我还可以采取哪些其他措施来进一步调查此问题?
我发现问题仅仅是 Azure App Service 通过https
而不是http
公开 API。 只需将https
放入每个 URL 即可解决问题。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.