flask-restful with flask-auth :具有不同身份验证的多个 HTTP 方法



我正在尝试使用相同的URL,具有多个HTTP(GET,POST,PUT,DELETE)方法,并且对于每种方法,它使用flask-auth具有不同的身份验证。

我尝试创建比类更多的类

class GetUser(Resource):

    decorators = [Users.auth.login_required]
    def get(self):
        '''..etc'''
class PostUser(Resource):

    decorators = [Admin.auth.login_required]
    def post(self):
        '''..etc'''
restful_api.add_resource(GetUser,'/User')
restful_api.add_resource(PostUser,'/User')

但发生的事情是,restful_api.add_resource(PostUser,'/User')将覆盖restful_api.add_resource(GetUser,'/User')

我能看到的唯一合理的选择是你创建一个 Flask-RESTful 的 Resource 类的子类,并自己实现每个方法的装饰器。然后,您的资源可以从您的类继承以具有此功能。

Resource子类中,您需要提供 dispatch_request 方法的替代实现:https://github.com/flask-restful/flask-restful/blob/master/flask_restful/init.py#L543。

处理装饰器的代码是这样的:

    for decorator in self.method_decorators:
        meth = decorator(meth)

我想您可以将method_decorators更改为字典,然后按如下方式应用装饰器:

    for decorator in self.method_decorators[request.method.lower()]:
        meth = decorator(meth)

那么你上面的例子变成:

class User(MyResource):
    method_decorators = {
        'get': [Users.auth.login_required],
        'post': [Admin.auth.login_required]
    }
    def get(self):
        '''..etc'''
    def post(self):
        '''..etc'''
restful_api.add_resource(User,'/User')

我发现我也可以这样做

class User(Resource):

    @Admin.auth.login_required
    def post(self):
        '''..etc'''
    @Users.auth.login_required
    def get(self):
        '''..etc'''

相关内容

  • 没有找到相关文章

最新更新