我是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
方法没有身份验证,所以任何人都可以在不登录的情况下获取列表。我正在使用烧瓶 - 我不知道如何将装饰器单独分配给每个功能。
答案 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]}