Python 更改/替换烧瓶中的不可变请求对象

Python 更改/替换烧瓶中的不可变请求对象,python,oauth,flask,immutability,werkzeug,Python,Oauth,Flask,Immutability,Werkzeug,目前,我正在为非RESTAPI开发一个Oauthlib Flask实现。但是我有两个场景,我想更改/添加flask请求对象的值。因为它是不可变的,所以不容易实现。我试着按照中的建议复制一份。但是由于@oauth.authorize\u处理程序使用给定的请求对象,因此我必须替换它,这将在UnboundLocalError中解析:在赋值之前引用的局部变量'request'错误。以下是我的示例代码(它是隐式授权的一部分): 我是否做错了什么,或者是否有其他可能更改请求对象 谢谢你的帮助 更新: 上面的

目前,我正在为非RESTAPI开发一个Oauthlib Flask实现。但是我有两个场景,我想更改/添加flask请求对象的值。因为它是不可变的,所以不容易实现。我试着按照中的建议复制一份。但是由于
@oauth.authorize\u处理程序
使用给定的请求对象,因此我必须替换它,这将在
UnboundLocalError中解析:在赋值之前引用的局部变量'request'错误。以下是我的示例代码(它是隐式授权的一部分):

我是否做错了什么,或者是否有其他可能更改请求对象

谢谢你的帮助

更新: 上面的代码描述了我希望将信息传递给tokensetter函数的情况。这可以用一个全局变量来完成,但我想避免这样做

在我的注册例程中,客户端向API发送如下请求:

params_signup = {
    "schemas":["urn:scim:schemas:core:2.0:User"],
    "expireIn":3600,
    "username":"test@web.de",
    "password":"123",
    "access_token":"",
    "externalId":"tmeinhardt",
    "grant_type":"password",
    "client_id":"1",           
    "params":{
        "age":"20-30",
        "gender":"m",
        }
   }

我只需要令牌处理程序的
grant\u type
client\u id
部分,并希望手动将其添加到请求对象。但是由于这个对象是不可变的…

为那些遇到这个问题并试图实现OAuth流的人写这篇文章

不要使用装饰器,而是使用中间件

我认为你应该用中间件来处理这个问题。在中间件中,您可以设置call函数的第二个参数的授权属性,该参数包含您在init函数中传递的当前wsgi应用程序环境变量。 请看下面的代码:

def __init__(self, app):
    self.app = app

def __call__(self, environ, start_response):
    cookie = Request(environ).cookies.get('access_token')
    if cookie is not None:
        environ['HTTP_AUTHORIZATION']='Bearer '+cookie
    return self.app(environ, start_response)

但是在方法运行之前,
oauth.authorize\u处理程序将访问上下文全局
request
。由于Flask的性质,您也不能简单地重新绑定全局名称。首先,您到底想做什么来更改请求?您可以替换请求本身上的特定对象,例如。@MartijnPieters是的,oauth.authorize\u处理程序在之前访问变量。但是我的功能是在我的更改生效之前执行的。请告诉我们您试图解决的问题;这是一个不太清晰的描述。你能更新你的问题并补充一下吗?您只是想将信息传递给您的令牌设置器函数吗?该信息不能存储在
g
global中吗?
def __init__(self, app):
    self.app = app

def __call__(self, environ, start_response):
    cookie = Request(environ).cookies.get('access_token')
    if cookie is not None:
        environ['HTTP_AUTHORIZATION']='Bearer '+cookie
    return self.app(environ, start_response)