Правильный код:
from contextlib import contextmanager
from flask import appcontext_pushed, g, json, jsonify, Flask
app = Flask(__name__)
@app.route('/users/me')
def users_me():
return jsonify(username=g.user)
@contextmanager
def user_set(app, user):
def handler(sender, **kwargs):
g.user = user
with appcontext_pushed.connected_to(handler, app):
yield
def test_1():
user = '123'
with user_set(app, user):
with app.test_client() as c:
resp = c.get('/users/me')
data = json.loads(resp.data)
assert data['username'] == user
Это демо, как я сказал. В моем реальном приложении я хочу отправить пользовательский объект в g, который создан с помощью функции ниже.
def login(client, email, password):
print(f'login_info test start')
ret = client.post('/api/login', json=dict(
email=email,
password=password
), follow_redirects=True)
assert ret.status_code == 200
data = json.loads(ret.data)
uid = data['uid']
customer = CustomerService.get(uid)
print(f'login test end {customer.email}')
assert customer
вы можете заметить, что в функции нет возврата. Так что я получаю None и отправляю это g. Но я не заметил, что это ночью.
flask -do c имеет некоторые неполные и неоднозначные демо:
with user_set(app, my_user):
with app.test_client() as c:
resp = c.get('/users/me')
data = json.loads(resp.data)
self.assert_equal(data['username'], my_user.username)
, если приложение меняется на flaskr, я могу иметь больше смелости попробовать.
with user_set(flaskr, my_user):
with app.test_client() as c:
resp = c.get('/users/me')
data = json.loads(resp.data)
self.assert_equal(data['username'], my_user.username)
Я ищу в Google около 5 часов, чтобы выяснить, почему appcontext_push.connected_to ничего не отправлять ... Каждое полученное мной демо не работает. У меня кончилось мужество.
спасибо, что ответил на такой простой вопрос. Вы показываете, что это действительно работает, что-то не так в моем собственном коде. Вы даете мне мужество, которое действительно много значит. Еще раз спасибо!