web-dev-qa-db-ja.com

基本的なFlask vs API開発のためのFlask-RESTfulの使用

次のアプリケーション用にREST APIを開発しようとしています。使用するには、Python Flaskしかし、この時点では、どのオプションを使用するのかわかりません。基本的なFlaskパッケージまたはFlask= Flask-RESTful拡張機能を使用する必要があります。両方にいくつかの長所と短所があります。

以下は、同じことを行う2つのAPIの例ですが、FlaskおよびFlask-RESTful:

フラスコバージョン

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よりも優れた利点をいくつか提供しますか?

14
Shahlin Ibrahim

RESTは非常に柔軟なアーキテクチャですが、Flask-RESTfulを使用することで、Flaskだけを使用するアプローチで考慮する価値のある点がいくつかあります。

  1. 慣例により、単一のリソース(/ users/1234など)に対するGETは、リソースの一意の識別子によるものです。ユーザーの名前は一意であることが保証されていないため、URI内で識別子として使用するのは危険です(例:/ users/joe)。

  2. コレクション内のユーザーにアクセスするときは、Flaskの例、/ user/...)で示すように、複数形の名詞を使用することをお勧めします。

  3. POSTを作成して使用する場合、クライアントがIDを指定していない限り(一意性を保証できる必要があるため、有効なIDはほとんどUUIDのみ)、コレクションURIにのみ投稿できます。 (例:/ users /)。

どちらも機能しますが、Flask-RESTfulを使用すると、これらのガイドラインに従うと、クラスがリソースとより密接に一致し、説明するクラスが急増することはありません。

非常によく似た使用例が https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example に示されています。

4
rich carter

代わりに Flask-RESTplus を使用することをお勧めします。これにより、Swaggerが完全にサポートされます。

Flaskを使用することに関しては、Swagger機能を取得することはFlask-Restplusを選択するための大きなものだと思います。

2
StefanE