运行aiohttp服务器后,使get请求崩溃错误



有一个程序,但是,当我运行程序并转到http://127.0.0.1:8080/scan/192.168.0.1/1/10服务器时出现"500内部服务器错误服务器陷入了麻烦"并抛出一些异常。

from aiohttp import web
import logging
import json
import asyncio

def catch_exception(func):
async def decorated_function(ip, port, scan_loop):
try:
await func(ip, port, scan_loop)
return [{"port": str(port), "state": "open"}]
except asyncio.TimeoutError:
return [{"port": str(port), "state": "close"}]
return decorated_function

@catch_exception
async def check_port(ip, port, scan_loop):
conn = asyncio.open_connection(ip, port, loop=scan_loop)
await asyncio.wait_for(conn, timeout=3)

async def run(ip, begin_port, end_port, scan_loop):
tasks = [asyncio.ensure_future(check_port(ip, p, scan_loop)) for p in range(begin_port, end_port)]
responses = await asyncio.gather(*tasks)
return responses

async def handle(request):
ip = request.match_info.get('ip')
begin_port = int(request.match_info.get('begin_port'))
end_port = int(request.match_info.get('end_port'))
loop = asyncio.get_event_loop()
results = await asyncio.ensure_future(run(ip, begin_port, end_port, loop))
print(results)
response_obj = {'data': results}
return web.Response(text=json.dumps(response_obj), status=200)

def get_app():
new_app = web.Application()
new_app.router.add_get('/scan/{ip}/{begin_port}/{end_port}', handle)
return new_app

# _________________________ pytest _____________________________________
def create_app(loop):
test_app = get_app()
return test_app

async def test_hello(aiohttp_client):
client = await aiohttp_client(create_app)
resp = await client.get('/scan/192.168.0.1/1/10')
assert resp.status == 200
data = await resp.text()
dict_data = json.loads(data)
assert type(dict_data['data']) is list
# _________________________ pytest _____________________________________

logger = logging.getLogger('aiohttp.access')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
if __name__ == '__main__':
print('Starting!')
web.run_app(get_app())

然后python抛出如下所示的异常。我怎样才能解决这个问题?我能做些什么来完成我的计划呢?

Error handling request
Traceback (most recent call last):
File "C:UserspavelOneDriveРабочий столaiohttp_servervenvlibsite-packagesaiohttpweb_protocol.py", line 422, in _handle_request
resp = await self._request_handler(request)
File "C:UserspavelOneDriveРабочий столaiohttp_servervenvlibsite-packagesaiohttpweb_app.py", line 499, in _handle
resp = await handler(request)
File "C:UserspavelOneDriveРабочий столaiohttp_servermain.py", line 35, in handle
results = await asyncio.ensure_future(run(ip, begin_port, end_port, loop))
File "C:UserspavelOneDriveРабочий столaiohttp_servermain.py", line 25, in run
responses = await asyncio.gather(*tasks)
File "C:UserspavelOneDriveРабочий столaiohttp_servermain.py", line 10, in decorated_function
await func(ip, port, scan_loop)
File "C:UserspavelOneDriveРабочий столaiohttp_servermain.py", line 20, in check_port
await asyncio.wait_for(conn, timeout=3)
File "C:Program FilesWindowsAppsPythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0libasynciotasks.py", line 445, in wait_for
return fut.result()
File "C:Program FilesWindowsAppsPythonSoftwareFoundation.Python.3.10_3.10.1264.0_x64__qbz5n2kfra8p0libasynciostreams.py", line 47, in open_connection
transport, _ = await loop.create_connection(
TypeError: BaseEventLoop.create_connection() got an unexpected keyword argument 'loop'
127.0.0.1 [17/Jun/2022:07:05:40 +0000] "GET /scan/192.168.0.1/1/10 HTTP/1.1" 500 335 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.160 YaBrowser/22.5.2.615 Yowser/2.5 Safari/537.36"

这里的问题是asyncio.open_connection接受这里的任何参数'循环检查删除loop=scan_loop将解决这个问题

from aiohttp import web
import logging
import json
import asyncio

def catch_exception(func):
async def decorated_function(ip, port, scan_loop):
try:
await func(ip, port, scan_loop)
return [{"port": str(port), "state": "open"}]
except asyncio.TimeoutError:
return [{"port": str(port), "state": "close"}]
return decorated_function

@catch_exception
async def check_port(ip, port, scan_loop):
conn = asyncio.open_connection(ip, port)
await asyncio.wait_for(conn, timeout=3)

async def run(ip, begin_port, end_port, scan_loop):
tasks = [asyncio.ensure_future(check_port(ip, p, scan_loop)) for p in range(begin_port, end_port)]
responses = await asyncio.gather(*tasks)
return responses

async def handle(request):
ip = request.match_info.get('ip')
begin_port = int(request.match_info.get('begin_port'))
end_port = int(request.match_info.get('end_port'))
loop = asyncio.get_event_loop()
results = await asyncio.ensure_future(run(ip, begin_port, end_port, loop))
print(results)
response_obj = {'data': results}
return web.Response(text=json.dumps(response_obj), status=200)

def get_app():
new_app = web.Application()
new_app.router.add_get('/scan/{ip}/{begin_port}/{end_port}', handle)
return new_app

# _________________________ pytest _____________________________________
def create_app(loop):
test_app = get_app()
return test_app

async def test_hello(aiohttp_client):
client = await aiohttp_client(create_app)
resp = await client.get('/scan/192.168.0.1/1/10')
assert resp.status == 200
data = await resp.text()
dict_data = json.loads(data)
assert type(dict_data['data']) is list
# _________________________ pytest _____________________________________

logger = logging.getLogger('aiohttp.access')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
if __name__ == '__main__':
print('Starting!')
web.run_app(get_app())

最新更新