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

Python 2.7 flask restful with flask auth:具有不同身份验证的多个HTTP方法,python-2.7,authentication,flask,flask-restful,flask-httpauth,Python 2.7,Authentication,Flask,Flask Restful,Flask Httpauth,我正在尝试使用具有多个HTTP(GET、POST、PUT、DELETE)方法的相同url,并且对于每个方法,它使用flask auth进行不同的身份验证 我试着创造出比课堂更多的东西 class GetUser(Resource): decorators = [Users.auth.login_required] def get(self): '''..etc''' class PostUser(Resource): decorators = [

我正在尝试使用具有多个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\u api.add\u resource(postaser,/User')
将覆盖
restful\u api.add\u resource(GetUser,/User')

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

资源
子类中,需要提供
调度请求
方法的替代实现:

处理装饰器的代码如下:

    for decorator in self.method_decorators:
        meth = decorator(meth)
我想您可以将
方法\u decorators
更改为字典,然后按如下方式应用decorator:

    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'''

@Admin.auth.login\u required def post(…)
@svrist有什么问题?@svrist:这不适用于基于类的视图,如Flask-RESTful使用的视图。这种方法的问题是,装饰程序会收到额外的
self
参数,因为您是在装饰方法而不是函数。对于一些装饰者来说,这可能不是一个问题,但有些人可能不希望有额外的参数。