我正在尝试将一个具有大量API调用(即获取密钥列表的数据)的应用程序迁移到使用asyncio,因为这是一项IO密集型任务。此API需要NTLM身份验证,因为它使用Active Directory凭据,为此我使用了以下代码:
session.auth = requests_ntlm.HttpNtlmAuth(username, password, session)
显然,asyncio使用aiohttp进行异步会话处理。因此,它是同步的,工作正常,但试图将其移动到更理想的异步/等待流,aiohttp只接受基本的身份验证凭据,如果NTLM auth被传递到^{TypeError: BasicAuth() tuple is required instead
。以下是供参考的代码示例:
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会话并使其正常工作
好吧,有两种方法可以做到这一点
1路不是很好,因为它使用异步任务与
loop.run_in_executor()
。2路更好,但我真的不知道它是否可行。
如果您能够查看HttpNtlmAuth的源文件,您可以看到
HttpNtlmAuth
类是从requests.auth.AuthBase()
继承的让我们看看
AuthBase()
到底是关于什么的:因此,如果我是对的,那么
AuthBase()
类唯一要做的事情就是检查Auth钩子是否可调用。所以基本上你需要自己去实现它相关问题 更多 >
编程相关推荐