Flask-restful基本身份验证

时间:2017-12-01 10:02:52

标签: python flask flask-restful

我是Flask的新手,我的学校工作需要一些帮助。

我正在尝试使用flask-restful构建一个简单的ToDo列表系统。

我目前的代码如下:

class ToDoList(Resource):
    '''TODO LIST'''
    operation = ['delete']
    decorators = [auth.login_required, advertise('operation')]
    def post(self):
        """remove all item in the TODO list"""
        operation = request.args.get('op')
        if operation == 'delete':
            collection2.delete_many({})
            return {'Success': 'OK'}, 200
        return {'Error':'Illegal Operation'}, 400
    def get(self):
        """return a list of the TODO name"""
        list_1 = collection2.find()
        list_2 = []
        for each in list_1:
            list_2.append(JSONEncoder().encode(each))
        return {'list':list_2}, 200

它可以工作,但我只想要post方法来要求身份验证,而get方法没有身份验证,所以任何人都可以在不登录的情况下获取列表。我正在使用烧瓶 - 我不知道如何将装饰器单独分配给每个功能。

2 个答案:

答案 0 :(得分:3)

我使用flaskrestplus进行基本身份验证。所有必需的授权均作为授权字典提供。然后将它们传递给API。 还可使用

在方法级别应用授权
@api.doc(security='basicAuth')

可以在称为require_Auth的装饰器中编写验证逻辑(可以是ldap验证或db验证)。使用

调用此装饰器
decorators = [requires_Auth]

完整代码

from flask import Flask, request
from flask_restplus import Api, Resource
from functools import wraps

def requires_Auth(f):
    @wraps(f)
    def decorator(*args, **kwargs):
        auth = request.authorization
        if auth:
           print "inside decorator", auth.username,auth.password
            return f(*args, **kwargs)
        else:
            return "Login required!!!!",401
    return decorator


authorizations = {
    'basicAuth': {
        'type': 'basic',
        'in': 'header',
        'name': 'Authorization'
    }
}
api = Api(app, version='1.0', 
    authorizations=authorizations
)

ns = api.namespace('/', description='Authentication API')

@ns.route('/withDecorator')
class HelloWorldWithDecorator(Resource):
    decorators = [requires_Auth]
    @api.doc(security='basicAuth')
    def get(self):        
        return {'hello': 'world'}

api.add_namespace(ns)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5001)

答案 1 :(得分:2)

来自Flask-RESTful文档[1]:

  

或者,您可以指定映射到HTTP方法的迭代字典,而装饰器仅适用于匹配的请求。

def cache(f):
    @wraps(f)
    def cacher(*args, **kwargs):
        # caching stuff
    return cacher

class MyResource(restful.Resource):
     method_decorators = {'get': [cache]}

     def get(self, *args, **kwargs):
        return something_interesting(*args, **kwargs)

     def post(self, *args, **kwargs):
        return create_something(*args, **kwargs)

在你的情况下,它将是:

method_decorators = {'post': [auth.login_required]}