Изменить/заменить неизменяемый объект запроса в Flask

В настоящее время я работаю над реализацией Oauthlib-Flask для API без REST. Но у меня есть два сценария, в которых я хочу изменить/добавить значение объекта запроса фляги. Поскольку это неизменно, это не так просто. Я попытался сделать дубликат, как это предлагается в разделе "Изменение значений в объекте запроса werkzeug" < /а>. Но поскольку @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":"[email protected]",
    "password":"123",
    "access_token":"",
    "externalId":"tmeinhardt",
    "grant_type":"password",
    "client_id":"1",           
    "params":{
        "age":"20-30",
        "gender":"m",
        }
   }

Мне нужны части grant_type и client_id только для обработчика токенов, и я хотел добавить их вручную в объект запроса. Но так как этот объект неизменяем...


person timeinhardt    schedule 29.05.2014    source источник
comment
Но oauth.authorize_handler получит доступ к глобальному контексту request до запуска вашего метода. Из-за того, как Flask обрабатывает контекст запроса, вы также не можете просто перепривязать глобальное имя .   -  person Martijn Pieters    schedule 29.05.2014
comment
Что именно вы пытаетесь сделать, что требует от вас изменить запрос в первую очередь? Например, вы можете заменить определенные объекты в самом запросе.   -  person Martijn Pieters    schedule 29.05.2014
comment
@MartijnPieters да, oauth.authorize_handler раньше обращается к переменной. но моя функция выполняется до той части, где мои изменения должны вступить в силу   -  person timeinhardt    schedule 29.05.2014
comment
Пожалуйста, сообщите нам, какую проблему вы пытаетесь решить; это имеет все признаки проблемы XY   -  person Martijn Pieters    schedule 29.05.2014
comment
Здесь мне нужна переменная, которую я использую в моей функции @login позже в моей функции tokensetter. но при этом объект запроса изменяется. И в моей процедуре регистрации я хочу избежать отправки необходимых параметров oauth и добавить их вручную в свою процедуру и передать их обработчику.   -  person timeinhardt    schedule 29.05.2014
comment
Это не очень четкое описание. Можете ли вы обновить свой вопрос и добавить это? Вы просто пытаетесь передать информацию своей функции токенсеттера? Разве эта информация не может храниться в глобальном g?   -  person Martijn Pieters    schedule 29.05.2014


Ответы (1)


Пишу это для тех, кто столкнется с этим и попытается реализовать поток OAuth.

Не используйте декораторы, используйте промежуточное ПО

Я считаю, что вы должны справиться с этим в промежуточном программном обеспечении. В промежуточном программном обеспечении вы можете установить свойство авторизации 2-го параметра функции call, которая содержит текущие переменные среды приложения wsgi, которые вы передали в своей функции init. Посмотрите на код ниже:

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)
person Night King    schedule 20.01.2021