首页 > 解决方案 > Flask 如何在没有我将请求作为参数的情况下通过装饰器传递请求变量?

问题描述

我一直在学习 python 装饰器,我想知道烧瓶如何将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()呢?

标签: pythonflaskpython-decorators

解决方案


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


推荐阅读