gpt4 book ai didi

python - 更改/替换 Flask 中的不可变请求对象

转载 作者:行者123 更新时间:2023-12-05 05:26:47 25 4
gpt4 key购买 nike

目前我正在为非 REST API 开发 Oauthlib-Flask 实现。但是我有两种情况想要更改/添加 flask 请求对象的值。因为它是不可变的,所以这并不容易。我尝试按照 Changing values on a werkzeug request object 中的建议制作副本.但由于 @oauth.authorize_handler 使用给定的请求对象,我必须替换它,这会导致 UnboundLocalError: local variable 'request' referenced before assignment 错误。这是我的示例代码(它是隐式授权的一部分):

@app.route('/oauth/authorize', methods=['GET', 'POST'])
@login
@oauth.authorize_handler
def authorize(*args, **kwargs):
if request.method == 'GET':
client_id = kwargs.get('client_id')
client = Client.query.filter_by(client_id=client_id).first()
kwargs['client'] = client
return render_template('authorize.html', **kwargs)

r = make_duplicate_request(request)
#Change/add values of r
request = r
return True

我是不是做错了什么或者是否有另一种可能性来改变请求对象?

感谢您的帮助!

更新:上面的代码描述了我想将信息传递给 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",
}
}

我只需要 token 处理程序的 grant_typeclient_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)

关于python - 更改/替换 Flask 中的不可变请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23931371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com