繁体   English   中英

Flask API 在本地正常工作但在 Azure App Service 上返回 415

[英]Flask API works correctly locally but returns 415 on Azure App Service

当前环境

  • Python 3.10
  • Flask 2.3.2 和服务员 2.1.2
  • Postgresql Azure 上的 DB Postgresql 托管服务(灵活服务器)
  • 为具有与上述相同要求的服务器运行 docker 容器的应用服务
  • 使用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-TypeAccept header,无论如何我都会这样做。 我还检查了应用程序服务和托管数据库之间的连接,假设如果这两个服务无法通信,可能会出现一些问题。 为此,我在应用服务上创建了一个服务连接器,其目标是托管数据库,所以我想一切正常。

在我看来奇怪的是,不需要任何负载的/api/hello端点在两种环境中都能正常工作,而需要负载的api/filter/<tablename>端点的工作方式不同。

我错过了什么吗? 我还可以采取哪些其他措施来进一步调查此问题?

我发现问题仅仅是 Azure App Service 通过https而不是http公开 API。 只需将https放入每个 URL 即可解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM