gpt4 book ai didi

python - Flask 回调未通过 pytest 运行

转载 作者:行者123 更新时间:2023-12-04 16:45:39 29 4
gpt4 key购买 nike

我正在使用 Deferred Callback Pattern snippet在 Flask 中设置 cookie。 (目前使用 11.1,但尝试 12.0 也没有改变行为。)

我已经添加了打印语句来确定,但可以通过其他方式(检查 cookie)确认当我的应用程序在 gunicorn 或 Flask 的调试服务器中运行时回调按预期运行。

在pytest(3.0.5)中运行时,我可以确认请求在测试中执行,因为命令输出被测试检查,并且匹配。

但是,虽然添加了回调,但它没有 运行 . (通过 Print 语句和检查测试客户端的 cookie jar 确认。)

测试代码为:

def test_get_new_auth_happy_path_basic_auth_preloaded(monkeypatch, client):
'''
Test that, when a client requests a token, and that client already
has the 'basic auth' credentials preloaded with valid values, the
client response includes the cookie setting with the matching token.
'''
monkeypatch.setattr('powersvc.auth.get_public_key',
mock.Mock(return_value=SECRET))
monkeypatch.setattr('powersvc.auth.get_token', mock_get_token)

basic_auth = "Basic {user}".format(user=b64encode(
b"{username}:{password}".format(username=USERNAME,
password=PASSWORD)))
res = client.get("/v1.1/token", headers={
"Authorization": basic_auth,
})
assert res.status_code == 200
assert res.get_data() == str(TOKEN)
assert auth.TOKEN_HEADER in client.cookie_jar

前两个断言通过,第三个失败。

[编辑:上面的第三个测试是错误的,但是使用 --pdb 运行 pytest 我也可以看到 cookie 没有设置:
(Pdb) print res.headers
Content-Type: text/html; charset=utf-8
Content-Length: 109


(Pdb)

感谢 Nick Frost 指出这一点。]

我试过用两种不同的方式重写测试——使用 pytest-flask live_server 固定装置(目前在 pytest-flask 0.10.0 上),并且只使用基本的 pytest 而没有 pytest-flask 固定装置——它们都失败了相同的方式:添加回调,未执行回调,相应的 cookie 不存在。

同样,代码在正常执行时有效,但在通过 pytest 执行时无效。

为了完整起见,这里是添加回调的/v1.1/token 函数。 (回调代码与上面的代码片段相同,除了日志语句。):
def get_new_auth():
'''
Attempt to get a new token with a username and password via Basic Auth
and put this new token in a cookie.

If we get a valid token, return its decrypted form.
If no valid token is possible, return None.
'''

LOGGER.debug('In get_new_auth.')
auth = flask.request.authorization
if auth:
token = get_token(auth.username, auth.password)
LOGGER.debug('Auth found. New token is {}'.format(token))

# Set a callback to ensure the token cookie gets set
@server.after_this_request
def add_token(response):
response.set_cookie(TOKEN_HEADER, token)

return str(decrypt_token(token))
else: # No basic auth in request
LOGGER.debug('No auth information available - demanding new auth')
return demand_authentication()

最佳答案

将您的代码与 Flask 片段代码一起使用,看起来确实像设置了 cookie。但是,您的测试代码似乎存在问题。

原来'cookie_name' in client.cookie_jar不会告诉您 cookie 是否在 cookie jar 中。您可以改为查看 Set-Cookie header 直接查看是否设置了cookie:

assert 'Set-Cookie' in res.headers
assert res.headers['Set-Cookie'].startswith(auth.TOKEN_HEADER + '=')

或者,您可以使用 CookieJar内部直接检查是否 client在其 cookie jar 中有 token :
assert auth.TOKEN_HEADER in client.cookie_jar._cookies['localhost.local']['/']

编辑:你也可以创建一个 flask.Response 对象并返回它而不是通过回调:
token = get_token(auth.username, auth.password)
LOGGER.debug('Auth found. New token is {}'.format(token))

res = Response(str(decrypt_token(token)))
res.set_cookie(TOKEN_HEADER, token)
return res

关于python - Flask 回调未通过 pytest 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519496/

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