希望这不是一个太愚蠢的问题,但我在处理aiohttp曲奇时遇到了麻烦。
Aiohttp的CookieJar类提到它实现了遵循RFC 6265的cookie存储,其中声明:
给定主机的
的另一个端口上的服务也可读取cookie。
但是,如果我创建了两个aiohttp服务器,一个让您“登录”并返回一个cookie,另一个服务器的端点希望您拥有一个cookie,这两个服务器都托管在本地主机(我猜是两个不同的端口),那么cookie将不会被处理。
下面是一组使用aiohttp、pytest、pytest和pytest-aiohttp来解释的4种测试:
import functools
import pytest
from aiohttp import web
pytestmark = pytest.mark.asyncio
def attach_session(f):
@functools.wraps(f)
async def wrapper(request: web.Request):
session_id = request.cookies.get("testcookie")
request["mysession"] = session_id
response = await f(request)
response.set_cookie("testcookie", session_id)
return response
return wrapper
def is_logged_in(f):
@functools.wraps(f)
@attach_session
async def wrapper(request: web.Request):
session = request["mysession"]
if not session:
raise web.HTTPUnauthorized
return await f(request)
return wrapper
async def login(_: web.Request):
response = web.Response()
response.set_cookie("testcookie", "somerandomstring")
return response
@is_logged_in
async def some_endpoint(request: web.Request):
return web.Response(text="sweet")
@pytest.fixture
def auth_client(event_loop, aiohttp_client):
app = web.Application()
app.router.add_post("/login", login)
return event_loop.run_until_complete(aiohttp_client(app))
@pytest.fixture
def core_client(event_loop, aiohttp_client):
app = web.Application()
app.router.add_get("/some_endpoint", some_endpoint)
return event_loop.run_until_complete(aiohttp_client(app))
async def test_login(auth_client):
resp = await auth_client.post("/login")
assert resp.status == 200
assert resp.cookies.get("testcookie").value == "somerandomstring"
async def test_some_endpoint_anonymous(core_client):
resp = await core_client.get("/some_endpoint")
assert resp.status == 401
async def test_some_endpoint_as_logged_in(auth_client, core_client):
resp1 = await auth_client.post("/login")
resp2 = await core_client.get("/some_endpoint", cookies=resp1.cookies)
assert resp2.status == 401
async def test_some_endpoint_as_logged_in_again(auth_client, core_client):
resp1 = await auth_client.post("/login")
_cookie = list(resp1.cookies.values())[0]
resp2 = await core_client.get(
"/some_endpoint", cookies={_cookie.key: _cookie.value}
)
assert resp2.status == 200但据我理解,"test_some_endpoint_as_logged_in“测试应该有效。为什么它返回401,而同样的事情,但发送饼干作为一个迪克返回200?
发布于 2022-11-04 10:49:20
我认为在客户端之间共享cookie的正确方法是将resp1的resp1对象加载到core_client.session.cookie_jar。
更改test_some_endpoint_as_logged_in的代码以修复它:
async def test_some_endpoint_as_logged_in(auth_client, core_client):
resp1 = await auth_client.post("/login")
core_client.session.cookie_jar.update_cookies(resp1.cookies)
resp2 = await core_client.get("/some_endpoint")
assert resp2.status == 401Cookie数据保存在会话对象中,因为auth_client和core_client是不同的会话,其中自己的数据cookie数据是不共享的。这相当于使用不同的浏览器,每个浏览器都有自己的cookie_jar。
https://stackoverflow.com/questions/74195374
复制相似问题