[PYTHON] Richten Sie einen einfachen HTTPS-Server mit Asyncio ein

Überblick

Ich habe einen einfachen HTTPS-Server eingerichtet, um das Asyncio-Modul für Ereignisschleifen und Uvloop zu üben. uvloop ist ein Modul, das auf asyncio und libuv basiert. Seit 2016 sind neue Mikroframeworks wie Sanic und Japronto mit Uvloop entstanden.

Annahme

Angenommen, Python 3.6. In Python 3.6 wurde der Standardwert von SSLContext des SSL-Moduls geändert und Konstanten wurden konsolidiert.

Über uvloop

uvloop implementiert asyncio.AbstractEventLoop und bietet eine mit uvloop kompatible API. Aufgrund von libuv-Einschränkungen unterstützt uvloop Windows nicht, daher ist asyncio für den Fallback von uvloop verantwortlich.

Erstellen Sie ein selbstsigniertes Zertifikat

Sie können ein selbstsigniertes Zertifikat mit dem folgenden Einzeiler erstellen.

# https://stackoverflow.com/a/41366949/531320
openssl req -x509 -newkey rsa:4096 -sha256 \
-nodes -keyout server.key -out server.crt \
-subj "/CN=example.com" -days 3650

Richten Sie einen HTTPS-Server ein

Richten wir einen Echoserver ein, der unabhängig von der HTTP-Methode eine Zeichenfolge zurückgibt.

server.py


import asyncio
import ssl

async def request_handler(reader, writer):
    msg = (
      'HTTP/1.1 200 OK\r\n'
      'Content-Type: text/plain; charset=utf-8\r\n'
      '\r\n'
      'hello\r\n'
    )
    writer.write(msg.encode())
    await writer.drain()
    writer.close()

host = '127.0.0.1'
port = 8000

ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ctx.load_cert_chain('server.crt', keyfile='server.key')
ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1

loop = asyncio.get_event_loop()
coro = asyncio.start_server(
  request_handler, 
  host, port, ssl=ctx, loop=loop
)
server = loop.run_until_complete(coro)

print('Serving on {}'.format(server.sockets[0].getsockname()))

try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

server.close()
loop.run_until_complete(server.wait_closed())
loop.close()

Erstellen Sie einen HTTPS-Client

Jetzt erstellen wir einen HTTPS-Client.

client.py


import asyncio
import ssl

async def http_client(host, port, msg, ctx, loop):
    reader, writer = await asyncio.open_connection(
        host, port, ssl=ctx, loop=loop
    )

    writer.write(msg.encode())
    data = await reader.read()
    print("Received: %r" % data.decode())
    writer.close()

host = '127.0.0.1'
port = 8000
msg = (
  'GET / HTTP/1.1\r\n'
  'Host: localhost:8000\r\n'
  '\r\n'
  '\r\n'
)

ctx = ssl.create_default_context()
ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

loop = asyncio.get_event_loop()
loop.run_until_complete(http_client(host, port, msg, ctx, loop))
loop.close()

aiohttp

aiohttp ist ein auf asyncio basierendes HTTP-Modul, das auch über Funktionen zur Anwendungsentwicklung verfügt. Die Installation ist wie folgt:

pip3 install aiohttp

Lassen Sie uns einen Server einrichten, auf dem HTML-Dateien angezeigt werden.

server.py


from aiohttp import web
from pathlib import Path
import ssl

host='localhost'
port=8000
ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ctx.load_cert_chain('server.crt', keyfile='server.key')
ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1

app = web.Application()
app.router.add_static('/static', path=str(Path.cwd().joinpath('static')), show_index=True)
web.run_app(app, host=host, port=port, ssl_context=ctx)

Recommended Posts

Richten Sie einen einfachen HTTPS-Server mit Asyncio ein
Richten Sie mit Python 3 einen einfachen HTTPS-Server ein
[Vagrant] Richten Sie einen einfachen API-Server mit Python ein
Richten Sie mit Docker einen Samba-Server ein
Richten Sie einen lokalen Server mit Go-File-Upload ein.
Richten Sie einen lokalen Server mit Go-File-Download ein.
Richten Sie einen einfachen SMTP-Server in Python ein
Richten Sie einen einfachen lokalen Server auf Ihrem Mac ein
Richten Sie einen Webserver mit CentOS7 + Anaconda + Django + Apache ein
Richten Sie mit Twisted einen Mailserver ein
Senden Sie E-Mails mit mailx an einen mit Python eingerichteten Dummy-SMTP-Server.
Starten Sie mit Docker einen einfachen Python-Webserver
Richten Sie einen Test-SMTP-Server in Python ein.
Richten Sie einen UDP-Server in der Sprache C ein
Richten Sie mit CentOS Linux 8 + Apache mod_ssl einen Reverse-Proxy für den https-Server ein
So richten Sie einen lokalen Entwicklungsserver ein
Einführung und Verwendung der Python-Flasche ・ Versuchen Sie, einen einfachen Webserver mit Anmeldefunktion einzurichten
Richten Sie einen Minecraft-Ressourcenserver (Spigot) über Docker (2) ein.
Richten Sie mit Samba einen Dateiserver unter Ubuntu 20.04 ein
Richten Sie in 30 Minuten einen kostenlosen Server unter AWS ein
[Teil 1] Lassen Sie uns einen Micra-Server unter Linux einrichten
Richten Sie einen Minecraft-Ressourcenserver (Spigot) über Docker ein
Richten Sie mit Sublime Text 2 eine Python-Entwicklungsumgebung ein
Erstellen Sie einen (einfachen) REST-Server
Erstellen Sie einen einfachen Textlint-Server
Richten Sie eine Python-Entwicklungsumgebung mit Visual Studio Code ein
Laden Sie den mit Gunicorn eingerichteten Server neu, wenn Sie den Code ändern
So richten Sie einen einfachen SMTP-Server ein, der lokal in Python getestet werden kann
Richten Sie mit Django ein soziales Login ein
Richten Sie pygit2 mit statischem Link ein
Erstellen eines Flask-Servers mit Docker
Schreiben Sie einen supereinfachen TCP-Server
Erstellen einer einfachen Power-Datei mit Python
Einfacher RSS-Reader mit Django
Erstellen Sie einen einfachen WebDAV-Server unter Linux
Stellen Sie die Lambda-Funktion ein und lassen Sie sie mit S3-Ereignissen arbeiten!
Zeichnen Sie ein Mandelbrot-Set mit Brainf * ck
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Erstellen Sie eine einfache Web-App mit Flasche
Richten Sie mit http.server in Python 3 in 30 Sekunden einen lokalen Webserver ein
Richten Sie einen Server ein, der mehrere Verbindungen gleichzeitig verarbeitet
Ich habe mit Python einen einfachen Blackjack gemacht
Stellen Sie Docker in Windows Home und führen Sie einen einfachen Webserver mit Python aus
Starten Sie einen temporären http-Server lokal mit Pytest
Erstellen Sie einen lokalen Server mit einem einzeiligen Befehl [Mac]
Richten Sie golang mit goenv unter GNU / Linux ein
Erstellen Sie mit Flask einen einfachen Punktbildgenerator
Spielen Sie den Server mit zwei PCs
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Starten Sie einen Webserver mit Python und Flask
Richten Sie eine Python-Entwicklungsumgebung auf Marvericks ein
Einfache Aufgabenliste, erstellt mit Python + Django
Hängen Sie das Verzeichnis eines anderen Servers mit sshfs ein
Erstellen Sie in Tornado einen HTTP-Server (Hello World)
So bereiten Sie die Umgebung mit Courseras fortgeschrittenem Kurs für maschinelles Lernen auf Google Colab vor
Richten Sie einen Dateiserver mit Samba mit ZeroPi von Friendly Arm ein [Betriebssysteminstallation]
[Mac] Ich möchte einen einfachen HTTP-Server erstellen, auf dem CGI mit Python ausgeführt wird