因此,我已经弄清楚了如何编写一个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>
,它将无法正常工作。
答案 0 :(得分:6)
答案是正确的,但是在与 ASGI 工作者一起以 WSGI 运行的生产环境中使用FastAPI是一个更好的选择,这就是为什么我为question,所以结果如下。
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(每秒请求数)和响应时间存在巨大差异。
独角兽与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}"
}
答案 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
我得到了:
所以,我添加了 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()))