Как лучше всего менять заголовки в запросе Flask? - PullRequest
3 голосов
/ 06 марта 2020

У меня есть приложение Flask, которое использует собственный декоратор для проверки AWS токена входа в систему Cognito, переданного в атрибуте заголовка HTTP. Процесс включает в себя обновление токена (что выходит за рамки этого вопроса). Как только я получу обновленный токен, я бы хотел обновить атрибут заголовка, чтобы включить обновленный токен и выйти. Поскольку свойство Flask / Werkzeug request.headers является неизменным, я не могу обновить его обычным способом.

Как я могу обновить заголовки в контексте этого декоратора? Есть ли лучший способ, о котором я не думаю?

Вот пример кода, который демонстрирует проблему:

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        token = request.headers.get('X-MyApp-Auth')
        if not token:
            return redirect(url_for('login', next=request.url))
        # Test for expired token (pseudocode)
        if expired(token):
            # Refresh the token (pseudocode)
            new_token = refresh(refresh_token)
            # This is the part where the immutability gets me stuck
            request.headers.set('X-MyApp-Auth', new_token)
        return f(*args, **kwargs)
    return decorated_function

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

В этом примере приложение Flask помещается в пользовательское промежуточное ПО WSGI, которое изменяет среду WSGI перед обработкой запроса Flask:

from flask import Flask, request, jsonify


class InterceptRequestMiddleware:
    def __init__(self, wsgi_app):
        self.wsgi_app = wsgi_app

    def __call__(self, environ, start_response):
        environ['HTTP_USER_AGENT'] = 'foobar'
        return self.wsgi_app(environ, start_response)


app = Flask(__name__)
app.wsgi_app = InterceptRequestMiddleware(app.wsgi_app)


@app.route('/')
def index():
    return jsonify({'headers': {k: v for k, v in request.headers}})


if __name__ == '__main__':
    app.run(debug=True)

Ссылки:

enter image description here

0 голосов
/ 17 марта 2020

request.headers - это заголовки HTTP, которые ваш сервер получил от клиентского приложения, поэтому имеет смысл не обновлять их. Возможно, вы хотите установить заголовки ответа, которые можно сделать следующим образом: Как установить заголовки ответа в Flask?

...