Flask-restful 基本认证

Boy*_* Li 3 python flask flask-restful

我是 Flask 的新手,我的学业需要一些帮助。

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

我当前的代码如下所示:

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
Run Code Online (Sandbox Code Playgroud)

它有效,但我只post想要需要身份验证的方法和不需要身份验证的get方法,这样任何人都可以在不登录的情况下获取列表。我正在使用flask-restful 我不知道如何分别为每个函数提供装饰器。

小智 5

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

@api.doc(security='basicAuth')
Run Code Online (Sandbox Code Playgroud)

验证逻辑(可以是 ldap 验证或 db 验证)可以写在一个叫做 requires_Auth 的装饰器中。这个装饰器是使用调用的

decorators = [requires_Auth]
Run Code Online (Sandbox Code Playgroud)

完整代码

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)
Run Code Online (Sandbox Code Playgroud)