22

所以我已经想出了如何编写一个fastAPI,我准备将我的脚本部署到我使用过fastAPI(https://fastapi.tiangolo.com/)的heroku,但是问题是当我向heroku发出请求时它只会返回:

<html>
  <head>
    <title>Internal Server Error</title>
  </head>
  <body>
    <h1><p>Internal Server Error</p></h1>

  </body>
</html>

这意味着脚本已打开,但我看不到错误,我会说它在本地工作得很好。

我无法看到问题所在的任何日志,但是我会说我的问题可能是我不确定我的procfile是否正确,因为我根本没有编辑它,而且我对此很陌生,我在这里问我如何能够在 heroku 中运行我的 fastapi 脚本?

我所知道的是,为了能够运行脚本,你必须使用命令uvicorn main:app --reload,如果你这样做,它将不起作用等等py main.py我做错了什么?

4

5 回答 5

24

答案是正确的,但是在生产环境中使用 FastAPI 作为WSGIASGI工作者是一个更好的选择,这就是为什么,我为这个问题运行了一个基准测试,所以这里是结果。

Gunicorn 与 Uvicorn 工人

Requests per second:    8665.48 [#/sec] (mean)
Concurrency Level:      500
Time taken for tests:   0.577 seconds
Complete requests:      5000
Time per request:       57.700 [ms] (mean)

纯Uvicorn

Requests per second:    3200.62 [#/sec] (mean)
Concurrency Level:      500
Time taken for tests:   1.562 seconds
Complete requests:      5000
Time per request:       156.220 [ms] (mean)

如您所见,每个请求的RPS(每秒请求数)和响应时间存在巨大差异。

档案

Gunicorn 与 Uvicorn 工人

web: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

纯uvicorn

web: uvicorn main:app --workers 4
于 2020-08-15T15:48:49.597 回答
18

我已经测试了你的设置,经过一些检查(以前从未使用过 Heroku)我猜你的 uvicorn 永远不会绑定到指定的端口(heroku-cli 命令heroku local对你有用吗?)

您的 Procfile 可能如下所示;

web: uvicorn src.main:app --host=0.0.0.0 --port=${PORT:-5000}

此示例假定您的源代码位于名为“src”的子文件夹中,该子文件夹有一个空__init__.py(表示 Python 模块,您可能希望将 src 添加到 PYTHONPATH,请参阅 app.json)并main.py包含您的 fastapi 应用程序;

import socket
import sys

from fastapi import FastAPI

app = FastAPI()

hostname = socket.gethostname()

version = f"{sys.version_info.major}.{sys.version_info.minor}"


@app.get("/")
async def read_root():
    return {
        "name": "my-app",
        "host": hostname,
        "version": f"Hello world! From FastAPI running on Uvicorn. Using Python {version}"
    }

我已将我的工作示例添加到github,您可以在heroku上查看(现在)

于 2019-12-18T21:52:20.173 回答
6

您还可以将 FastAPI 配置Gunicornuvicorn作为工作进程运行。以下是您可以保存在 Heroku 用来启动和运行应用程序的 Procfile 中的命令行。以下命令将在 3 个工作进程上启动您的应用程序

web: gunicorn -w 3 -k uvicorn.workers.UvicornWorker main:app

有关详细的分步视频,您可以访问此视频教程,该教程详细介绍了如何在 6 分钟内在 Heroku 上部署 FastAPI。或者您可以从这篇博文详细了解如何在 Heroku 上创建和部署基于 python 的 FastAPI 。

于 2020-01-27T11:55:52.580 回答
2

相比之下,与纯 uvicorn 相比,uvicornworkers 的处理速度要快得多,这使得 FastAPI 执行进程的速度比 Flask 快得多。

在生产中,建议将 guincorn 与 Uvicornworkers 一起使用

在 heroku Procfile 中,

网站:gunicorn -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:$PORT main:app

$PORT:不采用固定端口,而是优先使用动态端口。

于 2020-11-30T12:42:52.023 回答
0

就我而言,我没有将 wsgi 应用程序更新为 asgi 应用程序。

运行时:

gunicorn pm.wsgi --log-level=debug \
-k uvicorn.workers.UvicornWorker --log-file - --timeout 60

我有:

在此处输入图像描述

所以,我添加了WSGIMiddleware

import os

from django.core.wsgi import get_wsgi_application
from dj_static import Cling
from uvicorn.middleware.wsgi import WSGIMiddleware
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pm.settings")

# added the WSGIMiddleWare wrapper
application = WSGIMiddleware(Cling(get_wsgi_application()))
于 2021-04-27T01:08:05.667 回答