Flask-RESTful 指定特定端点允许的 HTTP 方法

Flask-RESTful specify HTTP methods allowed for specific endpoints

考虑到我有两个 Resource 类:

class UserView(Resource):
    def get(self, id):
        ...
    def post(self):
        ...
    def put(self, id):
        ...
    def delete(self, id):
        ...


class AnotherUserView(Resource):
    def get(self):
        ...
    def put(self):
        ...
    def delete(self):
        ...


api.add_resource(UserView, '/user/<int:id>')
api.add_resource(AnotherUserView, '/user')

鉴于上面的代码,UserViewGETPUTDELETE 方法都需要一个路径参数 id。因此,UserView 映射到路由 /user/<int:id>。但是,POST 方法不需要路径参数 id 而是包含在提供参数 id 的路由下,这会造成混淆。

所以现在,我在想是否有一种方法可以指定在特定路由(或端点)中允许哪些方法,就像我们可以用 Flask: @app.route('/user/<int:id>', methods=['GET', 'PUT', 'DELETE'] 做的那样。

预期我能做什么:

api.add_resource(UserView, '/user/<int:id>', methods=['GET', 'PUT', 'DELETE'])
api.add_resource(UserView, '/user', methods=['POST'])
api.add_resource(AnotherUserView, '/user', methods=['GET', 'PUT', 'DELETE'])

但这实际上是行不通的,因为编译器告诉我我正在覆盖视图函数 UserView

我阅读了 Flask-RESTful 的文档,发现 api.add_resource 没有 methods 的参数可以像 app.route 那样用于指定允许的 HTTP 方法.有办法实现吗?

在 Flask-Restful 中,class 函数 getpost 等对应于 http 方法。如果您不想要资源的特定方法,只需将其保留即可。

我个人认为 class 中没有 id 的 POST 方法不会造成混淆。

要获得预期的结果,请考虑为每个资源添加所需的路线。例如

from flask_restful import Api, Resource

class User(Resource):
    def get(self, id=None):
        if id:
            return "specific user"
        else:
            return "list of users"

    def post(self):
        return "post with no id!"

    def delete(self, id=None):
        if id:
            return "deleting user"
        else:
            return "need to specify a user"

api.add_resource(User, '/user', '/user/<int:id>')