标签: aiohttp

如何解决 OSError: [Errno 24] 使用 aiohttp 对三个不同 URL 执行 POST 调用时打开的文件过多?

我有 csv 文件,其中一列用作在两个 POST 方法调用中传递的数据。我有三个不同的 URL,需要随后在代码中调用。我使用 aiohttp 定义会话并循环列长度(其单元格值在两个 POST 调用中发送)。从响应中获取的数据存储在一个列表中,并用于具有不同 url 的第三个 POST 调用。

前两个调用似乎执行得很好而且相当快(我打印了它们的响应并进行了验证),但是当执行到第三个调用时,出现此错误:

OSError:[Errno 24]打开的文件太多

我尝试了一些建议connector=aiohttp.TCPConnector(verify_ssl=False)aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=False)) 但这不起作用的解决方案中指定。解决这个问题的最佳方法应该是什么?我当前使用的第二个 URL 是 HTTP URL,即 localhost url,最终将更改为基于 https 云的 url。

下面是描述这种情况的示例代码:

import aiohttp
import pandas as pd
import asyncio
import requests
import json
import time

start_time = time.time()

df = pd.read_csv('Sample.csv', header=None, dtype=str)
RequestBodyvalues = df.iloc[:, [0]].values

async def get_FirstUrlresponse(session, url, requestBody, headers):
    async with session.post(url, data = json.dumps(requestBody), headers = headers) as resp:
        response = await resp.json()
        return …
Run Code Online (Sandbox Code Playgroud)

python asynchronous python-asyncio aiohttp

4
推荐指数
1
解决办法
3589
查看次数

Python Aiohttp Asyncio:如何在每个任务之间创建延迟

我试图解决的问题: 我正在向服务器发出许多 api 请求。我试图在异步 api 调用之间创建延迟,以遵守服务器的速率限制策略。

我想要它做什么 我希望它的行为如下:

  1. 发出 api 请求 #1
  2. 等待0.1秒
  3. 发出 api 请求 #2
  4. 等待0.1秒...等等...
  5. 重复直到所有请求都提出
  6. 收集响应并在一个对象中返回结果(结果)

问题: 当我在代码中引入asyncio.sleep()time.sleep()时,它仍然几乎立即发出 api 请求。它似乎延迟了print()的执行,但没有延迟 api 请求。我怀疑我必须在循环中创建延迟,而不是在 fetch_one() 或 fetch_all() 处,但不知道如何做到这一点。

代码块:

async def fetch_all(loop, urls, delay): 
    results = await asyncio.gather(*[fetch_one(loop, url, delay) for url in urls], return_exceptions=True)
    return results

async def fetch_one(loop, url, delay):

    #time.sleep(delay)
    #asyncio.sleep(delay)

    async with aiohttp.ClientSession(loop=loop) as session:
        async with session.get(url, ssl=SSLContext()) as resp:
            # print("An api call to ", …
Run Code Online (Sandbox Code Playgroud)

python api delayed-execution python-asyncio aiohttp

4
推荐指数
1
解决办法
4597
查看次数

Python aiohttp 返回与 python 请求不同的响应。我需要帮助理解原因

经过昨天整个晚上和今天早上,我真的有助于理解为什么 aiohttp 请求返回的结果与 requests 请求不同。

import requests

reqUrl = "https://api-mainnet.magiceden.io/all_collections_with_escrow_data"

headersList = {
 "Accept": "*/*",
 " User-Agent" : " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36" 
}

payload = ""

response = requests.request("GET", reqUrl, data=payload,  headers=headersList)

print(response.text)
Run Code Online (Sandbox Code Playgroud)

返回整个内容 {"collections":[{"symbol"....

import aiohttp
import asyncio 

headersList = {
            'authority': 'api-mainnet.magiceden.io',
            'Accept': 'application/json, text/plain, */*',
            'accept-language': 'en-US,en;q=0.9',
            'origin': 'https://magiceden.io',
            'referer': 'https://magiceden.io/',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-site',
            'sec-gpc': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …
Run Code Online (Sandbox Code Playgroud)

python screen-scraping python-requests aiohttp

4
推荐指数
1
解决办法
4621
查看次数

如何在 Django 异步视图之间共享(初始化和关闭)aiohttp.ClientSession 以使用连接池

Django 从 3.1 版本开始支持异步视图,因此它非常适合对外部 HTTP API 等非阻塞调用(例如使用aiohttp)。

\n

经常看到以下代码示例,我认为它在概念上是错误的(尽管它工作得很好):

\n
import aiohttp\nfrom django.http import HttpRequest, HttpResponse\n\nasync def view_bad_example1(request: HttpRequest):\n    async with aiohttp.ClientSession() as session:\n        async with session.get("https://example.com/") as example_response:\n            response_text = await example_response.text()\n            return HttpResponse(response_text[:42], content_type="text/plain")\n
Run Code Online (Sandbox Code Playgroud)\n

此代码ClientSession为每个传入请求创建一个,效率低下。aiohttp然后不能使用例如连接池。

\n
\n

不要\xe2\x80\x99t为每个请求创建一个会话。您很可能需要每个应用程序有一个会话来共同执行所有请求。

\n

来源:https ://docs.aiohttp.org/en/stable/client_quickstart.html#make-a-request

\n
\n

这同样适用于 httpx:

\n
\n

另一方面,客户端实例使用 HTTP 连接池。这意味着当您向同一主机发出多个请求时,客户端将重用底层 TCP 连接,而不是为每个请求重新创建一个连接。

\n

来源:https://www.python-httpx.org/advanced/#why-use-a-client

\n
\n

有什么方法可以aiohttp.ClientSession在 Django 中全局实例化,以便可以在多个请求之间共享该实例吗?不要忘记必须ClientSession在正在运行的事件循环中创建(为什么在事件循环之外创建 ClientSession …

python django python-asyncio aiohttp

4
推荐指数
1
解决办法
1519
查看次数

我可以对整个模块使用上下文管理器吗?

我想要一个在应用程序的生命周期内打开(输入?)的上下文管理器。它应该在模块加载时打开,并在模块销毁时关闭。

包装整个模块代码是行不通的,因为当模块加载完成时,上下文管理器将关闭,而当实际调用方法时,上下文管理器将不再打开。

import aiohttp

with context as c:

  def f1():
    c.do_something('one')

  def f2():
    c.do_something('two')
Run Code Online (Sandbox Code Playgroud)

具体来说,我想aiohttp.ClientSession为该模块创建一个,该模块可重用于多个不同的请求,并在应用程序停止时干净地关闭。为此使用上下文管理器是一个好主意还是有更好的方法?

python contextmanager aiohttp

4
推荐指数
1
解决办法
248
查看次数

从aiohttp POST请求中提取json post参数

目前我做的是这样的

app.router.add_route('POST', '/foo/{par}', foo_test)
Run Code Online (Sandbox Code Playgroud)

如何从请求中提取POST的主体

@asyncio.coroutine
def foo_test(request):
    body = request.content.read() #returns a generator
Run Code Online (Sandbox Code Playgroud)

我的问题是如何从返回的发电机中提取身体?

python aiohttp

3
推荐指数
1
解决办法
1857
查看次数

使用aiohttp的Python lib美丽的汤

有人知道怎么做:

import html5lib
import urllib
from bs4 import BeautifulSoup

soup = BeautifulSoup(urllib.request.urlopen('http://someWebSite.com').read().decode('utf-8'), 'html5lib')
Run Code Online (Sandbox Code Playgroud)

使用aiohttp而不是urllib?

谢谢^^

python aiohttp

3
推荐指数
2
解决办法
2231
查看次数

SQL注入保护是否内置在SQLAlchemy的ORM或Core中?

我正在开发aiohttp服务器应用程序,但我只看到它显然无法使用SQLAlchemy的ORM层。因此,我想知道:如果我的应用程序只能使用SQLAlchemy的核心,是否仍然可以防止SQL注入攻击?

我的代码如下:

async def add_sensor(db_engine, name):
    async with db_engine.acquire() as connection:
        query = model.Sensor.__table__.insert().values(name=name)
        await connection.execute(query)
Run Code Online (Sandbox Code Playgroud)

这个相关问题中可接受答案的评论使我感到怀疑:

您仍然可以使用execute()或SQLAlchemy不会转义的其他文字数据。

那么,execute()使用我的代码中的,上面的引用是否表示我的代码不安全?总的来说,是否只有在SQLAlchemy ORM层上才可以防止SQL注入,就像最终将要启动的Core层一样execute()

python security sql-injection sqlalchemy aiohttp

3
推荐指数
1
解决办法
1617
查看次数

如何在Sanic中使用aiohttp ClientSession?

我试图了解什么是与Sanic一起使用aiohttp的正确方法。

从aiohttp 文档中,我发现以下内容:

不要为每个请求创建会话。每个应用程序很可能需要一个会话来执行所有请求。更复杂的情况可能需要在每个站点上进行一次会话,例如,一个会话用于Github,另一个会话用于Facebook API。无论如何,为每个请求建立会话是一个非常糟糕的主意。会话内部包含一个连接池。连接重用和保持活动状态(默认情况下均处于启用状态)可能会提高整体性能。

当我去Sanic文档时,我会找到一个这样的例子:

这是一个例子:

from sanic import Sanic
from sanic.response import json

import asyncio
import aiohttp

app = Sanic(__name__)

sem = None

@app.route("/")
async def test(request):
    """
    Download and serve example JSON
    """
    url = "https://api.github.com/repos/channelcat/sanic"

    async with aiohttp.ClientSession() as session:
         async with sem, session.get(url) as response:
         return await response.json()

app.run(host="0.0.0.0", port=8000, workers=2)
Run Code Online (Sandbox Code Playgroud)

这不是管理aiohttp会话的正确方法...

那么正确的方法是什么?
我应该在应用程序中启动会话并将会话注入到所有层中的所有方法吗?

我发现的唯一问题是这个,但这无济于事,因为我需要创建自己的类来使用该会话,而不是sanic。
还可以在Sanic文档中找到内容,该文档指出您不应在eventloop之外创建会话。

我有点困惑:(正确的方法是什么?

python asynchronous python-3.x aiohttp sanic

3
推荐指数
1
解决办法
1775
查看次数

使用aiohttp嵌套“与...同步”

我想创建一个使用aiohttp进行API调用的调度程序类。我尝试了这个:

import asyncio
import aiohttp

class MySession:
    def __init__(self):
        self.session = None

    async def __aenter__(self):
        async with aiohttp.ClientSession() as session:
            self.session = session
            return self

    async def __aexit__(self, exc_type, exc_val, exc_tb):
        if self.session:
            await self.session.close()

async def method1():
    async with MySession() as s:
        async with s.session.get("https://www.google.com") as resp:
            if resp.status == 200:
                print("successful call!")

loop = asyncio.get_event_loop()
loop.run_until_complete(method1())
loop.close()
Run Code Online (Sandbox Code Playgroud)

但这只会导致错误:RuntimeError: Session is closed。该__aenter__功能的第二种方法:

    async def __aenter__(self):
        self.session = aiohttp.ClientSession()
        return self
Run Code Online (Sandbox Code Playgroud)

效果很好。这是一个好结构吗?它不遵循如何使用aiohttp的示例。还想知道为什么第一种方法不起作用?

python python-asyncio aiohttp

3
推荐指数
1
解决办法
377
查看次数