如何在Heroku中运行UVICORN?

时间:2019-12-18 11:58:22

标签: python heroku fastapi uvicorn

因此,我已经弄清楚了如何编写一个fastAPI的代码,并准备将我的脚本部署到与fastAPI(https://fastapi.tiangolo.com/)一起使用的heroku上,但是问题是当我向heroku发出请求时,它将只需返回:

.inputfield {
  width: 0;
  padding: 0;
  border:none;
  transition: width 0.2s;
}
.inputfield:focus {
  padding: 1px;
  width: 150px;
}

这意味着脚本已打开,但我看不到错误,我会说它在本地完全正常。

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

我所知道的是,要能够运行脚本,您必须使用命令<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script><script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script><div id="root"></div>,如果您执行其他操作<html> <head> <title>Internal Server Error</title> </head> <body> <h1><p>Internal Server Error</p></h1> </body> </html> ,它将无法正常工作。

5 个答案:

答案 0 :(得分:6)

答案是正确的,但是在与 ASGI 工作者一起以 WSGI 运行的生产环境中使用FastAPI是一个更好的选择,这就是为什么我为question,所以结果如下。

独角兽与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)

纯羊角面包

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(每秒请求数)和响应时间存在巨大差异。

Procfiles

独角兽与Uvicorn工人

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

纯葡萄胎

web: uvicorn main:app --workers 4

答案 1 :(得分:4)

您还可以将FastAPI配置为以uvicorn作为工作进程在Gunicorn上运行。以下是命令行,您可以保留在Heroku使用的Procfile中,以使您的应用程序启动并运行。以下命令将在3个工作进程上启动您的应用

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

有关详细的分步视频,您可以访问此视频教程,其中详细介绍了如何deploy FastAPI on Heroku in just 6 minutes.,或者可以通过此blog post.详细了解如何在Heroku上创建和部署基于Python的FastAPI。 / p>

答案 2 :(得分:1)

我已经测试了您的设置,经过一番检查(之前从未使用过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上查看(暂时)

答案 3 :(得分:1)

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

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

在heroku Procfile中,

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

$ PORT:最好使用动态端口,而不是固定端口。

答案 4 :(得分:0)

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

运行时:

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

我得到了:

enter image description here

所以,我添加了 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()))