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

好了,到此,整個流程就全部完成了。以上都是這兩天研究這個框架時簡單總結的,如有錯誤,請留言指出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM