[英]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 鼓勵您遠離:
按照慣例,對單個資源(例如 /users/1234)的 GET 是通過資源的唯一標識符。 不能保證用戶的名稱是唯一的,因此將其作為 URI 中的標識符(例如 /users/joe)是有風險的。
當您訪問集合中的用戶時,最好始終使用復數名詞(而不是,正如您在 Flask 示例中所示,/user/...)。
當您創建和使用 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.