我寫(xiě)了一個(gè)Flask-restful的快速模板

我寫(xiě)了一個(gè)Flask-restful的快速模板

前言

前幾天在進(jìn)行項(xiàng)目開(kāi)發(fā)的時(shí)候,發(fā)現(xiàn)用Flask寫(xiě)一些輕量化的Web程序還是比較合適的。其實(shí)在Flask家族中,為了能夠更加方便的開(kāi)發(fā)Restful風(fēng)格的接口,F(xiàn)lask-restful是一個(gè)不錯(cuò)的選擇。雖然Flask-restful提供了比較完整的官方文檔,但是距離開(kāi)發(fā)上線項(xiàng)目還是不是很方便,因此我寫(xiě)了一個(gè)Flask-restful的快速模板。

此項(xiàng)目采用Mysql作為持久層數(shù)據(jù)庫(kù),實(shí)現(xiàn)了一個(gè)資源的5個(gè)接口,滿足基本的web開(kāi)發(fā)需求。

項(xiàng)目地址

首先給出項(xiàng)目地址:Flask-restful-quick-start

image-20211113211211982.png

項(xiàng)目簡(jiǎn)介

首先是項(xiàng)目的文件結(jié)構(gòu)。

├── flask_app
│   ├── common
│   │   ├── __init__.py
│   │   └── utils.py
│   ├── user
│   │   ├── __init__.py
│   │   ├── models.py
│   │   └── views.py
│   └── __init__.py
├── config.py
├── LICENSE
├── main.py
└── requirements.txt

項(xiàng)目中采用了藍(lán)圖來(lái)劃分功能塊,方面劃分項(xiàng)目模塊,并且提升可維護(hù)性。

目前我認(rèn)為這是一個(gè)相對(duì)比較科學(xué)的文件組織方案了。

Restful接口設(shè)計(jì)

基本的接口從兩個(gè)路由進(jìn)行接收

======================================
請(qǐng)求方法        路由              請(qǐng)求內(nèi)容
POST        /userList           userInfo
GET         /userList           None
GET         /user               userId
PUT         /user               userInfo
DELETE      /user               userId
======================================

做一個(gè)簡(jiǎn)單的介紹就是增加資源和查詢(xún)?nèi)抠Y源從資源列表接口走。

其他的帶參數(shù)請(qǐng)求和修改、刪除等從專(zhuān)門(mén)的資源接口走。

這樣就能避免GET請(qǐng)求帶參數(shù)和不帶參數(shù)的問(wèn)題了。

在項(xiàng)目中統(tǒng)一的處理能夠提升可靠性,降低編碼錯(cuò)誤,我這里對(duì)兩點(diǎn)進(jìn)行了統(tǒng)一。

1、Sqlalchemy的Model層對(duì)象和dict之間的轉(zhuǎn)換。

def row2dict(row):
    """
    參考文檔 https://stackoverflow.com/questions/1958219/convert-sqlalchemy-row-object-to-python-dict
    將model轉(zhuǎn)換為dict
    :param row: Sqlalchemy model
    :return: 輸出的字典
    """
    out_dict = {}
    for column in row.__table__.columns:
        out_dict[column.name] = str(getattr(row, column.name))
    return out_dict

通過(guò)以上代碼即可輕松地將model轉(zhuǎn)換為dict的字典了。

2、統(tǒng)一的回復(fù)內(nèi)容

class BaseResponse:
    def __init__(self):
        self.result_code_success = 200
        self.result_code_fail = 201

    def success(self, msg="success", data={}):
        result = {
            "code": self.result_code_success,
            "message": msg,
            "data": data
        }
        return jsonify(result)

    def fail(self, msg="fail", data={}):
        result = {
            "code": self.result_code_fail,
            "message": msg,
            "data": data
        }
        return jsonify(result)

統(tǒng)一的回復(fù)內(nèi)容包括了“成功”和“失敗”兩種情況,可自定義回復(fù)編碼和內(nèi)容。

啟動(dòng)項(xiàng)目

安裝

首先克隆本項(xiàng)目

$ git clone git@github.com:Jarrettluo/flask-restful-quick-start.git

cd flask-restful-quick-start

建議大家使用ide創(chuàng)建一個(gè)虛擬環(huán)境venv,避免項(xiàng)目使用的包與系統(tǒng)包不一致。

$ pip install requirements.txt

最后啟動(dòng)項(xiàng)目,開(kāi)始開(kāi)發(fā)

$ python run main.py

修改配置

在項(xiàng)目中的init.py中設(shè)置了連接數(shù)據(jù)庫(kù)的各項(xiàng)參數(shù),這些都是需要來(lái)自定義設(shè)置的。

user = "root"
password = "123456"
database = "flask_quick" # 需要修改的內(nèi)容
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://%s:%s@localhost:3306/%s" % (user, password, database)

在這里使用了MysqlDB,可以根據(jù)實(shí)際情況,進(jìn)行修改。

同時(shí)也強(qiáng)烈建議大家將這些設(shè)置信息放到config.py文件中,這樣方便統(tǒng)一修改。

在主程序中,防止了一個(gè)數(shù)據(jù)庫(kù)初始化的方法,可以進(jìn)行數(shù)據(jù)庫(kù)的清空和創(chuàng)建。

def init_db():
    # 丟掉全部表
    db.drop_all()
    # 創(chuàng)建全部表
    db.create_all()

快速開(kāi)發(fā)

增加模塊就只需要將現(xiàn)有的user模塊復(fù)制以后進(jìn)行修改即可。

在flask_app.__init.py中注冊(cè)藍(lán)圖

from flask_app.user import user_blueprint
app.register_blueprint(user_blueprint, url_prefix="/user")

在flask_app.user.__init.py中增加藍(lán)圖

user_blueprint = Blueprint("user_blueprint", __name__, url_prefix="/user")
from flask_app.user import views

enjoy。

結(jié)尾

純新手向的指導(dǎo),更多的內(nèi)容請(qǐng)參考Flask_restful的官方文檔.

如果您覺(jué)得上面的內(nèi)容對(duì)您有幫助歡迎點(diǎn)贊、評(píng)論、轉(zhuǎn)發(fā)!
更多內(nèi)容請(qǐng)查閱作者博客:https://jiaruiblog.com
或者star作者github: https://github.com/Jarrettluo?tab=repositories

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容