3

我正在尝试使用具有多个 HTTP(GET、POST、PUT、DELETE)方法的相同 url,并且对于每种方法,它使用 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')

4

2 回答 2

6

我能看到的唯一合理的选择是您创建 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')
于 2015-03-10T17:00:32.277 回答
3

我发现我也可以这样做

class User(Resource):


    @Admin.auth.login_required
    def post(self):
        '''..etc'''
    @Users.auth.login_required
    def get(self):
        '''..etc'''
于 2015-03-10T22:11:39.567 回答