gpt4 book ai didi

python - Asyncio 中的请求 - 关键字参数

转载 作者:太空狗 更新时间:2023-10-29 17:45:55 28 4
gpt4 key购买 nike

我正在使用 asynciorequests 模块来发出异步 HTTP 请求。

我可以像这样发出 GET 请求:

@asyncio.coroutine
def do_checks():
loop = asyncio.get_event_loop()
req = loop.run_in_executor(None, requests.get, 'https://api.github.com/user')
resp = yield from req
print(resp.status_code)
loop = asyncio.get_event_loop()
loop.run_until_complete(do_checks())

但是,我需要在请求中支持基本 HTTP 身份验证(described here)。

根据文档,urlauth 都是 requests.get() 的命名参数。

但是,如果我运行它(注意添加了 url=''auth = ''):

@asyncio.coroutine
def do_checks():
loop = asyncio.get_event_loop()
req = loop.run_in_executor(None, requests.get, url='https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
resp = yield from req
print(resp.status_code)
loop = asyncio.get_event_loop()
loop.run_until_complete(do_checks())

我收到这个错误:

TypeError: run_in_executor() got an unexpected keyword argument 'url'

在 asyncio.run_in_executor() 的原型(prototype)中,支持额外的参数:

BaseEventLoop.run_in_executor(executor, callback, *args)

requests.get() 显然支持命名参数(get、auth 等)。怎么了?

最佳答案

有两种方法可以做到这一点。创建包装器函数,或仅使用 session 来提供身份验证。

使用 session :

@asyncio.coroutine
def do_checks():
loop = asyncio.get_event_loop()
session = requests.Session()
session.auth = HTTPBasicAuth('user', 'pass')
req = loop.run_in_executor(None, session.get, 'https://api.github.com/user')
resp = yield from req
print(resp.status_code)

编写包装器函数(请注意,为了清楚起见,我在这里使用 def,但 lambda 显然也可以工作):

@asyncio.coroutine
def do_checks():
def do_req():
return requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
loop = asyncio.get_event_loop()
req = loop.run_in_executor(None, do_req)
resp = yield from req
print(resp.status_code)

关于python - Asyncio 中的请求 - 关键字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23946895/

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