簡體   English   中英

使用基本的 Flask 與 Flask-RESTful 進行 API 開發

[英]Using basic Flask vs Flask-RESTful for API development

我即將為我們即將推出的應用程序開發 REST API。 我決定為此使用 Python Flask。 但在這一點上,我不知道使用哪個選項。 我應該使用基本的 Flask package 還是 Flask 和 Flask-RESTful 擴展。 我發現兩者都有一些優點和缺點。

下面是兩個 API 做同樣事情但在 Flask 和 Flask-RESTful 中的示例:

Flask 版本

from flask import Flask, jsonify

app = Flask(__name__)

usersList = ['Aaron', 'Bianca', 'Cat', 'Danny', 'Elena']

@app.route('/users', methods=['GET'])
def users():
    return jsonify({ 'users': [user for user in usersList] })

@app.route('/user/<int:id>', methods=['GET'])
def userById(id):
    return jsonify({ 'username': usersList[id]  })

@app.route('/user/<string:name>', methods=['GET'])
def getUserByName(name):
    # Show some user information
    return "Some info"

@app.route('/user/<string:name>', methods=['POST'])
def addUserByName(name):
    usersList.append(name)
    return jsonify({ 'message': 'New user added'  })

app.run()

Flask-RESTful 版本

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

usersList = ['Aaron', 'Bianca', 'Cat', 'Danny', 'Elena']

class UsersList(Resource):
    def get(self):
        return { 'users' : [ user for user in usersList  ] }, 200


class UserById(Resource):
    def get(self, id):
        return { 'username': usersList[id] }


class UserByName(Resource):
    def post(self, name):
        usersList.append(name)

        return { 'message': 'New user added'}


api.add_resource(UsersList, '/users')
api.add_resource(UserById, '/user/<int:id>')
api.add_resource(UserByName, '/user/<string:name>')

app.run()

使用 Flask-RESTful,我無法獲得單個資源來服務多個相關端點,例如GET /user/<int:id>GET /user/<string:name>GET /user/<int:id>/friends等。而且我不知道為簡單的子資源創建新類是否是一種好習慣,因為我最終可能會得到很多類。 由於這個原因,我更傾向於只使用 Flask 因為只定義了函數並且可以根據我的需要自由定義端點。

牢記以上幾點,可以在 Flask-RESTful 中為子資源創建許多類嗎? 還是我最好使用 Flask? 或者 Flask-RESTful 比 Flask 提供了一些非常好的優勢?

REST 是一種非常靈活的架構,但在您僅使用 Flask 的方法中,有幾點值得考慮,Flask-RESTful 鼓勵您遠離:

  1. 按照慣例,對單個資源(例如 /users/1234)的 GET 是通過資源的唯一標識符。 不能保證用戶的名稱是唯一的,因此將其作為 URI 中的標識符(例如 /users/joe)是有風險的。

  2. 當您訪問集合中的用戶時,最好始終使用復數名詞(而不是,正如您在 Flask 示例中所示,/user/...)。

  3. 當您創建和使用 POST 時,除非您的客戶端指定了 id(在這種情況下它必須能夠保證唯一性,因此幾乎唯一有效的 id 將是 UUID),您可以只發布到集合 URI (例如/用戶/)。

兩者都可以,但是使用 Flask-RESTful,您會發現當您遵循這些指南時,您的類與您的資源更加匹配,並且您不會看到您描述的類的激增。

https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example演示了一個非常相似的用例。

我建議您改用Flask-RESTplus ,這將為您提供全面的 Swagger 支持。

關於僅使用 Flask,我想說獲得 Swagger 功能也是選擇 Flask-Restplus 的一個重要因素。

不知道為什么沒有人提到標准 Flask 也支持 REST-API 的事實,即你真的不需要導入 REST 包來利用標准 Flask 包中缺少的東西。

您完全可以根據自己的舒適度自由選擇所需的任何方法,並且選擇的任何方法都不應影響最終結果的功能。

我知道我們可能傾向於使用適合特定工作的東西,但有時,在編碼世界中,無論您必須編寫多少額外的代碼行,舒適度都很重要。

希望這能回答您的疑問。

在我個人看來,Flask-RESTful 濫用了 OOP 的使用,對我來說感覺不是一種直觀的方法。 我更喜歡 REST API 開發的“普通 Flask”,而不是 Flask-RESTful。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM