Flask如何在不将请求作为参数的情况下通过装饰器传递请求变量?

问题描述

我一直在学习python装饰器,我想知道flask如何将request变量传递到用路径装饰的函数中。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    print(request)
    return 'Hello,World!'

请求如何存在?为什么在编写函数时不必键入def hello_world(request)

当我尝试使自己的包装器模仿此类行为时

def wrapper(function):
    def wrapped_item(*args,**kwargs):
        request = "yes"
        function(*args,**kwargs,request=request)
    return wrapped_item

@wrapper
def hello_world():
    print(request)

hello_world()

它会导致错误TypeError: hello_world() got an unexpected keyword argument 'request'。但是,当我放置def hello_world(request)时,它可以正常工作。因此,如何仅拥有def hello_world()就可以使用它?

解决方法

Flask使用线程本地,这就是“魔术”发生的方式。有关更多信息,请参见https://flask.palletsprojects.com/en/1.1.x/advanced_foreword/https://werkzeug.palletsprojects.com/en/1.0.x/local/

,

这是您导入的变量

from flask import request

您的代码示例不包含它,但是我确定您的文件中包含它。