python - Cookie 未在 starlette TestClient 上设置,请求通过 Python 请求发送
问题描述
FastAPI 上的登录/注销功能在浏览器中工作,但我正在尝试为它编写单元测试。当我的应用设置 cookie 时,我可以看到响应确实发送了 cookie。当我通过 Python 请求收到它时,cookie 已从响应中删除,因此登录不起作用。
@pytest.fixture(scope='module')
def test_client():
app = create_app(testing=True)
client = TestClient(app)
client.base_url = 'https://localhost'
from app.models import Base, User
Base.metadata.create_all(bind=engine)
yield client
db.flush()
Base.metadata.drop_all(bind=engine)
# Simple login functions.
def test_login(test_client):
response = test_client.post(url='/login', data=dict(
username=username,
password=password
), allow_redirects=True, proxies=proxies)
breakpointB()
assert response.headers
然后在浏览器中工作的服务器端:
@core.post("/login", response_model=schemas.Token)
async def login_for_access_token(*, request: Request, form_data: OAuth2PasswordRequestForm = Depends(),
db: Session = Depends(get_db)):
token = jsonable_encoder(access_token)
response = RedirectResponse(url=request.url_for('index'), status_code=303)
response.set_cookie(
"Authorization",
value=f"Bearer {token}",
domain=os.environ.get('DOMAIN'),
httponly=False,
max_age=1800,
expires=1800,
)
breakpointA()
return response
所以在 BreakpointA() 处,就在发送响应之前,response.headers
如下所示:
MutableHeaders({'location': 'https://localhost/', 'set-cookie': 'Authorization="Bearer e
yJ0eXAiO5JKV1iLCJ4bGciOiJ2UzI1NiJ9.eyJzdWIiOi2b2Vqb2UiL253JleH1iOjE1DM0ODEzNTR7.zwbT9yV
OnV2V14Yrtuc1PP8wv82alz2354sgm0Rc7PgZIvc"; Domain=https://localhost; expires=Fri, 06 Mar 202
0 07:55:54 GMT; Max-Age=1800; Path=/'})
在 BreakpointB(),在我的测试客户端收到响应后,response.headers 和 response.cookies 如下所示:
(Pdb) response.headers
{'content-length': '24956', 'content-type': 'text/html; charset=utf-8'}
(Pdb) response.cookies
<RequestsCookieJar[]>
(Pdb) response.cookies.get_dict()
{}
我强烈怀疑这是因为域问题 - 但我该如何纠正呢?在我的 TestClient ( Starlette TestClient ) 中,我已经设置client.base_url = 'https://localhost'
了 ,并且在我的端点中制作了我设置的 cookie DOMAIN=https://localhost
。有人有解决这个问题的经验吗?
解决方案
刚碰到这个问题,在我的情况下,确实是因为TestClient
.
您可以将您的 cookie_domain 提供base_url
给您的TestClient
:
client = TestClient(app, base_url="http://example.com")
set-cookie
只要 base_url 与 cookie 域一致,就应该可以工作。
编辑:确保您的 cookie 域是没有http://
或https://
前缀的 FQDN
推荐阅读
- qt - 在 QtCreator 上安装自定义小部件
- excel - 合并 Excel 列并过滤掉空白
- php - 将 room_no 值作为 Integer 捕获到变量中
- sql - 连接永无止境
- ms-access - 是否可以在 MS 中创建链接表 - 从位于 OneDrive 或 Google Drive 上的 Excel 电子表格访问
- angular - 如何调用外部 HTML Angular 7 + Net Core?
- java - 如何在几个小时后重复android通知
- php - 通过在电子邮件字段中输入的电子邮件将表单数据发送给我自己
- bash - 使用 sed 用 env var 替换括号
- python - 我在我的 cmd 中运行一个 .py 脚本并出现错误“ModuleNotFoundError”