FastAPI环境部署
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastAPI环境部署相关的知识,希望对你有一定的参考价值。
参考技术A 查看使用的命令Gunicorn 是成熟的,功能齐全的服务器,Uvicorn 内部包含有 Guicorn 的 workers 类,允许你运行 ASGI 应用程序,这些 workers 继承了所有 Uvicorn 高性能的特点。
使用 Guicorn 来进行进程管理,我们可以动态增加或减少进程数量,平滑地重启工作进程,或者升级服务器而无需停机。
在生产环境中,Guicorn 大概是最简单的方式来管理 Uvicorn 了,生产环境部署我们推荐使用 Guicorn 和 Uvicorn 的 worker 类
获取Gunicorn进程树
重启Gunicorn任务
gunicorn的参数详解
启动unicorn
用于管理gunicorn,将其当作自己的子进程启动;当gunicorn由于异常等停止运行后,supervisor可以自动重启gunicorn
supervisor为c/s架构,supervisord 是服务端,supervisorctl 是客户端
supervisord启动成功后,可以通过supervisorctl客户端控制进程,启动、停止、重启
supervisor_gunicorn.ini
更详细参数部署可参考 Supervisord安装和配置
参考文档:
https://www.uvicorn.org/deployment/#gunicorn
https://www.cnblogs.com/mazhiyong/p/13384785.html
https://www.cnblogs.com/shijingjing07/p/9110619.html
FastApi应用和部署生产环境
最近Python的web框架FastApi火起来了,于是自己也搞了一个,写一下流程。
首先安装fastapi:
pip install fastapi
pip install uvicorn
新建一个启动文件,就叫main.py吧,引入一下包即可:
from fastapi import FastAPI import uvicorn
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
if __name__ == ‘__main__‘:
uvicorn.run(app=‘main:app‘, host="127.0.0.1", port=8000, reload=True, debug=True)
运行一下就可以了。输入http://127.0.0.1/docs,就会出现fastapi集成的api文档页面。
因为之前一直写php,习惯了mvc得结构,于是自己大概做了个结构,比如我现在需要一个新闻的模块 video_list.py(相当于控制器) :
from fastapi import APIRouter #引入fastapi的路由 import videoModel #自己的数据模型模块 import verify #自己的验参数模块 router = APIRouter() @router.post("/video/") async def video_list(page: verify.PageInfo): return videoModel.select_videos(page.page, page.pageSize)
然后在主文件引入
from fastapi import FastAPI import uvicorn import video_list #引入模块 app = FastAPI() app.include_router(router=video_list.router) #引入模块路由 @app.get("/") async def root(): return {"message": "Hello World"} if __name__ == ‘__main__‘: uvicorn.run(app=‘main:app‘, host="127.0.0.1", port=8000, reload=True, debug=True)
就像插线板一样,将每个小模块路由,插在主文件上。
数据模型层也单独建一个文件,在控制层引入一下:
import pymysql import config def select_videos(page, page_size): conf = config.config() db = pymysql.connect(host=conf[‘mysql_host‘], port=conf[‘mysql_port‘], user=conf[‘mysql_user‘], passwd=conf[‘mysql_passwd‘], db=conf[‘mysql_db‘], charset=‘utf8mb4‘) #unix_socket=‘/Applications/MAMP/tmp/mysql/mysql.sock‘) result = dict() limits = (page-1)*page_size try: sql = "select videos_id,title,qn_url,qn_thumbnails from `videos` where status = 1 " "order by published_at desc limit "+str(limits)+","+str(page_size) count_sql = "select count(*) as count from `videos` where status = 1" # 执行SQL语句 cursor = db.cursor() cursor.execute(sql) # 获取所有记录列表 lists = cursor.fetchall() cursor.execute(count_sql) # 获取所有记录列表 count = cursor.fetchone() res = [] for i in lists: data = dict() data[‘id‘] = i[0] data[‘title‘] = i[1] res.append(data) result[‘count‘] = count[0] result[‘list‘] = res except Exception as e: print(e) db.close() return result
这里要注意,控制层给模型层传数据时需要验证参数,使用 pydantic,没有的话pip安装一下,好像python 3.6之前的版本不支持这个。
from pydantic import BaseModel class PageInfo(BaseModel): page: int = 1 pageSize: int = 10
我这里验证的分页参数,具体使用规则,看文档。
这样一个简单的结构就完成了,剩下就是部署到生成环境了。需要nginx做转发:
location / { proxy_pass http://127.0.0.1:8000/; }
最后,再做一个守护进程让fastapi一直运行着,这里需要安装一个 gunicorn,当然,如果你有其他方式只要能用就行,
pip install gunicorn
然后在命令行输入:
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
好了,到此,整个流程就全部完成了。以上都是这两天研究这个框架时简单总结的,如有错误,请留言指出
以上是关于FastAPI环境部署的主要内容,如果未能解决你的问题,请参考以下文章