После небольшого перебора я думаю, что нашел хорошую причину использовать app.test_client()
, а также некоторые другие контекстные менеджеры, предоставляемые Flask.
Тестовый клиент
app.test_client()
Позволяет вам получить доступ к локальным контекстам через его менеджер контекста.
Это очень полезно при попытке получить доступ к переменным в _request_ctx_stack
( контекст запроса стек). например контекстные request
и session
локальные.
Некоторые расширения также хранят переменные в _request_ctx_stack
. например flask_login хранит current_user
и flask_stateless_auth хранит current_stateless_user
в стеке контекста запроса.
from flask import request
from flask_stateless_auth import current_stateless_user
with app.test_client() as c:
test_path = '/resource_for_authenticated_users'
c.get(test_path)
assert request.path == test_url
assert flask.session is not None # You can also access the session context local from here
assert current_stateless_user is not None
Если бы он вызывался без диспетчера контекста test_client()
, он выдал бы ошибку времени выполнения при попытке доступа к локальному контексту запроса после того, как _request_ctx_stack
был извлечен. Кроме того, current_stateless_user
вернет None
Контекст приложения
app.app_context()
Аналогично, вы можете получить доступ к переменным, которые хранятся в контексте приложения через менеджер контекста app.app_context()
, например:
from my_app.db import db # db connections are commonly stored on the `_app_ctx_stack`
with app.app_context():
db.create_tables()
assert db.session
assert db.query.MyTable.all()
Вы также можете получить доступ к глобальной переменной контекста приложения
(обычно используется для хранения глобальных переменных, связанных с приложением
которые не будут использоваться в нескольких запросах, таких как
session
global)
with app.app_context():
assert g.my_global_app_var
Контекст запроса теста
test_request_context()
Затем у вас есть app.test_request_context()
менеджер контекста, который используется для временной активации контекста запроса. Это лучше всего объяснить официальными документами .
Контекст транзакции сеанса
app.test_client().session_transaction()
Наконец, есть менеджер контекста session_transaction()
. Обычно это используется для изменения объекта сеанса. Это должно быть вложено в app.test_client()
.
Когда вызывается метод __exit__()
, сессия надежно сохраняется.
пример из документов :
with app.test_client() as c:
with c.session_transaction() as sess:
sess['a_key'] = 'a value'
# once this is reached the session was stored