使用基本的 Flask 与 Flask-RESTful 进行 API 开发 [英] Using basic Flask vs Flask-RESTful for API development

查看:32
本文介绍了使用基本的 Flask 与 Flask-RESTful 进行 API 开发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我即将为我们即将推出的应用程序开发 REST API.我决定为此使用 Python Flask.但此时,我不知道该使用哪个选项.我应该使用基本的 Flask 包还是带有 Flask-RESTful 扩展的 Flask.我发现两者都有一些优点和缺点.

I'm about to develop a REST API for our upcoming application. I have decided to use Python Flask for it. But at this point, I don't know which option to use. Should I be using the basic Flask package or Flask with Flask-RESTful extension. I've found some advantages and disadvantages in both.

以下是两个 API 在 Flask 和 Flask-RESTful 中执行相同操作的示例:

Below is an example of two APIs doing the same thing but in Flask and 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/GET/user/;, GET/user//friends 等等.我不知道为简单的子资源创建新类是否是一个好习惯,因为我会可能最终会有很多课程.由于这个原因,我更倾向于只使用 Flask,因为只定义了函数并且可以根据我的需要自由定义端点.

Using Flask-RESTful, I cannot get a single resource to serve multiple related endpoints like GET /user/<int:id>, GET /user/<string:name>, GET /user/<int:id>/friends etc. And I don't know if creating new classes for simple sub-resources is a good practice because I'll probably end up with many classes. Due to this reason, I'm more inclined towards using just Flask since only functions are defined and the endpoints can be freely defined as per my needs.

记住以上几点,在 Flask-RESTful 中为子资源创建很多类可以吗?还是我更喜欢使用 Flask?或者 Flask-RESTful 比 Flask 提供了一些非常好的优势?

Keeping the above in mind, is it okay to create many classes for sub-resources in Flask-RESTful? Or am I better of using Flask? Or Flask-RESTful provides some really good advantages over Flask?

推荐答案

REST 是一个非常灵活的架构,但是在您只使用 Flask 的方法中,有几点值得考虑,Flask-RESTful 鼓励您远离:

REST is a pretty flexible architecture, but there's a few points worth thinking about in your approach using just Flask, which Flask-RESTful is encouraging you away from:

  1. 按照惯例,对单个资源(例如/users/1234)的 GET 是通过资源的唯一标识符.不能保证用户的名称是唯一的,因此将其作为 URI 中的标识符(例如/users/joe)是有风险的.

  1. By convention, a GET on a single resource (e.g. /users/1234) is by a unique identifier for the resource. The name of a user can't be guaranteed to be unique, so it would be risky to have it as an identifier within the URI (e.g. /users/joe).

当您访问集合中的用户时,最好始终使用复数名词(而不是,如您在 Flask 示例中所示,/user/...).

When you access users within a collection, it's better to stick with the plural noun throughout (not, as you show in your Flask example, /user/...).

当您创建和使用 POST 时,除非您的客户端指定了 id(在这种情况下,它必须能够保证唯一性,因此几乎唯一有效的 id 将是 UUID),您可以仅发布到集合 URI(例如/users/).

When you're creating and using POST, unless your client is specifying the id (in which case it has to be able to guarantee uniqueness, so pretty much the only valid id would be a UUID), you can post to just the collections URI (e.g. /users/).

两者都行,但使用 Flask-RESTful,您会发现当您遵循这些准则时,您的类与您的资源更加匹配,并且您不会看到您描述的类的激增.

Either will work, but with Flask-RESTful you'll find that when you follow those guidelines, your class matches your resources much more closely and you won't see the proliferation of classes you describe.

一个非常相似的用例在 https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example.

A very similar use case is demonstrated at https://flask-restful.readthedocs.io/en/latest/quickstart.html#full-example.

这篇关于使用基本的 Flask 与 Flask-RESTful 进行 API 开发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆