user270199
user270199

Reputation: 1417

Decorating a Flask RESTful method

I'm getting a null value when I go to 127.0.0.1:5111/ with the following code:

import logging
from logging import getLogger
import time

logging.basicConfig(level='DEBUG')

class MyDec:
    def __init__(self, logger):
        self.logger = logger

    def __call__(self, f):
        def wrapper(*args, **kwargs):
            self.logger.info('Started task.')
            f(*args, **kwargs)
            self.logger.info('Completed task.')
        return wrapper
        
        
logger = getLogger('My Logger')

from flask import Flask
from flask_restful import Api, Resource

app = Flask('App')
api = Api(app)

class Foo(Resource):
    @MyDec(logger)
    def get(self):
        return 'Hello'
    
api.add_resource(Foo, '/')
    
app.run(port=5111, debug=True)

This works fine:

class Foo:
    @MyDec(logger)
    def bar(self, x, y=3):
         print(x, y)
         time.sleep(0.5)
        
        
foo = Foo()
foo.bar(x=1)

So there is something that the get() method does under the hood which I can't seem to figure out.

Upvotes: 0

Views: 524

Answers (1)

chris
chris

Reputation: 2063

The __call__ method in your decorator doesn't return anything at the moment, so it's swallowing the return "Hello" from your get. Try something like this:

    def __call__(self, f):
        def wrapper(*args, **kwargs):
            self.logger.info('Started task.')
            data = f(*args, **kwargs)
            self.logger.info('Completed task.')
            return data
        return wrapper

Upvotes: 2

Related Questions