没有任何现成的Web框架,如何使用异步Python 3 HTTP服务器?

4

我有一个Python服务器:

from http.server import BaseHTTPRequestHandler, HTTPServer

class Server(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write("Hello, World!".encode("utf-8"))


    def do_POST(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write("POST!".encode("utf-8"))

webServer = HTTPServer(("", serverPort), Server)
print(f"Server started at http://localhost:{serverPort}")

try:
    webServer.serve_forever()
except KeyboardInterrupt:
    webServer.server_close()
    print("Server stopped.")

但是这个服务器是同步工作的。

是否有可能创建一个异步HTTP服务器而不使用现成的Web框架? 如果可以,怎么做?

我尝试过以下方法:

webServer = ThreadingHTTPServer(("", serverPort), Server)
print(f"Server started at http://localhost:{serverPort}")

改为这样:

webServer = HTTPServer(("", serverPort), Server)
print(f"Server started at http://localhost:{serverPort}")

但我不确定它是否正常工作。


1
模块 aiohttp - furas
1
模块 tornado - furas
1
然后你将不得不从头开始编写所有内容。 - furas
1
顺便说一下,对我来说http.serveraiohttp处于同一水平线。两者都只是Web服务器,而不是Web框架。如果您不想使用aiohttp,那么就不应该使用http.server - furas
1
aiohttp不是web框架,而是像http.server一样的http服务器。也许你不能使用任何外部模块,那么你就必须使用标准的asyncasyncio从头开始编写。 - furas
显示剩余2条评论
1个回答

1

根据@furas的建议,我基于文档创建了一个示例服务器:

import asyncio
from aiohttp import web

async def handle(request):
    name = request.match_info.get('name', "Anonymous")
    text = "Hello, " + name
    print('Request served!')
    return web.Response(text=text)

async def run_web_server():
    app = web.Application()
    app.add_routes([web.get('/', handle),
                    web.get('/{name}', handle)])
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, 'localhost', 8080)
    await site.start()

async def run_other_task():
    while True:
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()
loop.create_task(run_web_server())
loop.run_until_complete(run_other_task())
loop.run_forever()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接