我正在尝试迁移具有大量 API 调用的应用程序(即获取密钥列表的数据)以使用 asyncio,因为它是一项 IO 密集型任务。此 API 需要 NTLM 身份验证,因为它使用 Active Directory 凭据,为此我使用以下代码:
session.auth = requests_ntlm.HttpNtlmAuth(username, password, session)
显然,asyncio 使用 aiohttp 进行异步会话处理。如此同步,它工作正常,但试图将其移动到更理想的异步/等待流,aiohttp 仅接受基本身份验证凭据,TypeError: BasicAuth() tuple is required instead
如果 NTLM 身份验证传递给aiohttp.ClientSession
. 这是供参考的代码示例:
import asyncio
from aiohttp import ClientSession
from requests_ntlm import HttpNtlmAuth
async def fetch(url, session):
async with session.get(url) as response:
print(f"url: {url} ({response.status})")
return await response.read()
async def run():
url = "http://server/page/{}"
tasks = []
conn = aiohttp.TCPConnector(limit=10)
async with ClientSession(connector=conn) as session:
session.auth = HttpNtlmAuth(username, password, session) # <--- Passing NTLM auth
for page in range(100):
task = asyncio.ensure_future(fetch(url.format(page), session))
tasks.append(task)
responses = await asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run())
loop.run_until_complete(future)
有没有办法将 NTLM 凭据传递给 aiohttp 会话并使其工作?