Search code examples
pythonflaskflask-restful

Flask-restful basic Authentication


I am new to Flask and I need some help for my school work.

I am trying to build a simple ToDo list system using flask-restful.

My current code looks like this:

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

It works, but I want only the post method to require authentication, and get method without authentication so anyone can acquire the list without login. I am using the flask-restful I don't know how to give the decorators separately to each function.


Solution

  • From Flask-RESTful documentation [1]:

    Alternatively, you can specify a dictionary of iterables that map to HTTP methods and the decorators will only apply to matching requests.

    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)
    

    In your case it would be:

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