Flask-restful基本身份验证

3

我是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 方法则不需要,这样任何人都可以在未登录的情况下获取列表。我正在使用 flask-restful,我不知道如何将装饰器分别应用到每个函数。

2个回答

5

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

@api.doc(security='basicAuth')

验证逻辑(可以是ldap验证或db验证)可以在名为requires_Auth的装饰器中编写。此装饰器使用以下方式调用:
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)

3

来自 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]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接