Schreiben Sie einen HTTP / 2-Server in Python

Erfahren Sie, wie Sie einen HTTP / 2-Server in Python mithilfe der in nghttp2 enthaltenen Python-API schreiben. Die Python-API wird als Erweiterungsbibliothek unter Verwendung der nghttp2 C-Bibliothek bereitgestellt. Python 3.4 oder höher ist erforderlich, da der Code, der den HTTP / 2-Server bereitstellt, das Modul "asyncio" verwendet. Erstellen Sie die Erweiterungsbibliothek. Benötigt das Python 3.4-Entwicklungspaket und Cython. Ubuntu 14.04 LTS akzeptiert die Pakete python3.4-dev und cython. Das Konfigurationsskript wählt automatisch die verfügbare Python-Umgebung aus, jedoch standardmäßig Ich denke, Python ist in vielen Fällen nicht 3.4. Geben Sie daher den Pfad des Interpreters von Python 3.4 explizit mit der Variablen PYTHON an und geben Sie ihn an das Konfigurationsskript weiter:

$ ./configure PYTHON=/usr/bin/python3.4

make install installiert die nghttp2 C-Bibliothek und die Python-Erweiterungsbibliothek. Wenn Sie sie nicht installieren möchten, können Sie die entsprechenden Verzeichnisse auch mit LD_LIBRARY_PATH und PYTHONPATH angeben.

Nachdem wir fertig sind, schreiben wir einen Server. Wir verwenden die Klassen "nghttp2.HTTP2Server" und "nghttp2.BaseRequestHandler". Die Klasse "nghttp2.HTTP2Server" wartet auf Verbindungen, betreibt Ereignisschleifen usw. Eine Klasse, die Serverfunktionalität bereitstellt. Nghttp2.BaseRequestHandler ist eine Klasse, die einen Stream (HTTP-Anforderung) verarbeitet. Es gibt eine Rückrufmethode, die für jedes Ereignis ausgelöst wird. Sie wird in Unterklassen unterteilt und diese Rückrufmethoden werden entsprechend implementiert und gestreamt. Schauen wir uns eine einfache Serverimplementierung an, die zuerst "nghttp2 FTW" zurückgibt und später eine ausführliche Erklärung hinterlässt:

import ssl
import nghttp2

class Handler(nghttp2.BaseRequestHandler):

    def on_headers(self):
        res = b'nghttp2 FTW\n'
        self.send_response(status=200,
                           headers = [('content-length', str(len(res)))],
                           body=res)

# SSL/So aktivieren Sie TLS,Zertifikatserver.crt,Privater Schlüsselserver.In der Schlüsseldatei
#sparen,Aktivieren Sie die folgenden 3 Zeilen, nghttp2.Geben Sie ctx für den ssl-Parameter HTTP2Server an.
# ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
# ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2
# ctx.load_cert_chain('server.crt', 'server.key')

server = nghttp2.HTTP2Server(('127.0.0.1', 8080), Handler, ssl=None)
server.serve_forever()

Bei der Ausführung wird Port 8080 abgehört. Beim Zugriff mit "nghttp http: //127.0.0.1: 8080 /" sollten die Zeichen "nghttp2 FTW" zurückgegeben werden.

Schauen wir uns nghttp2.BaseRequestHandler genauer an.

nghttp2.BaseRequestHandler bietet die folgenden Instanzvariablen:

Als nächstes werde ich die Rückrufmethode erläutern. Das obige Beispiel implementiert die Methode "on_headers ()". Diese Methode wird aufgerufen, wenn der Anforderungsheader empfangen wird. Es gibt andere Rückrufmethoden wie folgt. ..

Verwenden Sie zum Zurückgeben der Antwort die Methode send_response (status = 200, headers = None, body = None) wie im obigen Beispiel. * Status * gibt den HTTP-Statuscode an. * Headers * ist Geben Sie zusätzliche Antwortheader an. * Body * ist der Antworttext, der eine Instanz der Unterklasse "str", "byte" oder "io.Base" angibt.

Es bietet auch eine Push-Methode (Pfad, Methode = 'GET', request_headers = None, Status = 200, Header = None, body = None) zum Ausführen von Server Push, eine der Funktionen von HTTP / 2. Bei Server-Push müssen Sie den Anforderungspfad und die Anforderungsmethode angeben, die der Client beim Anfordern der vom Server gepussten Ressource anfordert, sowie zusätzliche Anforderungsheaderfelder. * Pfad *, * Methode * bzw. *. Angegeben von request_headers *. Die verbleibenden * status *, * headers *, * body * geben den Inhalt der Antwort auf dieselbe Weise an wie die Methode "send_response ()".

Fügen wir dem obigen Beispiel Server Push hinzu. Verschieben wir Ressourcen im Anforderungspfad / Push:

class Handler(nghttp2.BaseRequestHandler):

    def on_headers(self):
        self.push(path='/push',
                  status=200,
                  body='pushed content')

        res = b'nghttp2-python FTW\n'
        self.send_response(status=200,
                           headers = [('content-length', str(len(res)))],
                           body=res)

...

Sie können sehen, dass es gepusht wird, indem Sie mit dem Befehlszeilentool nghttp darauf zugreifen. Obwohl die Anzahl der zu multiplexenden Streams begrenzt ist, können mehrere Pushs angegeben werden. Aufgrund von Protokollbeschränkungen ist push ( ) Muss vor send_response () aufgerufen werden`.

Bisher haben wir Ihnen gezeigt, wie Sie einen HTTP / 2-Server mit der nghttp2-Python-API schreiben. Weitere Informationen zur API finden Sie in der Dokumentation (https://nghttp2.org/documentation/python-apiref.html).

Recommended Posts

Schreiben Sie einen HTTP / 2-Server in Python
Schreiben Sie Python in MySQL
DNS-Server in Python ....
Starten Sie einen HTTP-Server im aktuellen Verzeichnis
Sortieren Sie schnell ein Array in Python 3
Schreiben Sie Pandec-Filter in Python
Schreiben Sie die Beta-Distribution in Python
Schreiben Sie Python in Rstudio (reticulate)
Verwenden Sie den HTTP-Cache in Python
Einfacher HTTP-Server mit Python
Einfacher HTTP-Server für Python
Schreiben Sie eine Dichotomie in Python
Schreiben Sie die AWS Lambda-Funktion in Python
Schreiben Sie A * (A-Stern) -Algorithmen in Python
[Python] Wie schreibe ich eine if-Anweisung in einen Satz?
Lassen Sie uns mit Python 2 einen Investitionsalgorithmus entwickeln
Schreiben Sie Selentestcode in Python
Schreiben Sie ein Kreisdiagramm in Python
Schreiben Sie das Vim-Plugin in Python
Schreiben Sie eine Suche mit Tiefenpriorität in Python
Python in ist auch ein Operator
Schreiben Sie einen C-Sprach-Unit-Test in Python
Eine Alternative zu "Pause" in Python
CGI Server (1) Python Edition in einer Zeile
Ein einfacher HTTP-Client, der in Python implementiert ist
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Schreiben Sie eine kurze Eigenschaftsdefinition in Python
Schreiben Sie die O_SYNC-Datei in C und Python
Schreiben Sie ein Caesar-Verschlüsselungsprogramm in Python
Lesen und schreiben Sie JSON-Dateien mit Python
Schreiben Sie eine einfache Giermethode in Python
Schreiben Sie mit f2py ein Python-Modul in fortran
Schreiben Sie ein einfaches Vim-Plugin in Python 3
Wie schreibe ich Ruby to_s in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python