装饰 Flask RESTful 方法

Decorating a Flask RESTful method

当我使用以下代码转到 127.0.0.1:5111/ 时,我得到一个 null 值:

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)

这很好用:

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

所以 get() 方法在幕后做了一些我似乎无法弄清楚的事情。

装饰器中的 __call__ 方法目前没有 return 任何东西,因此它吞噬了 get 中的 return "Hello"。尝试这样的事情:

    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