Zum Inhalt

Endpunkte

Starlette enthält die Klassen HTTPEndpoint und WebSocketEndpoint, die ein klassenbasiertes Ansichtsmuster für die Verarbeitung von HTTP-Methodenplanung und WebSocket-Sitzungen bereitstellen.

HTTP-Endstufe

HTTPEndpoint Klassen sind als ASGI-Anwendungen verfügbar:

from starlette. responses import plainTextResponse (englisch)
von starlette. endpoints import HTTPENdpoint


class App (HTTPENDpoint) funktioniert mit:
    async def get (self, request): oder
        return PlainTextResponse (f "Hallo, Welt!")

Wenn Sie eine Starlette-Anwendungsinstanz verwenden, um das Routing zu verarbeiten, können Sie die Planung zu einer HTTPEndpoint-Klasse durchführen, indem Sie sicherstellen, dass der Zeitplan an die Klasse selbst und nicht an die Instanz der Klasse gerichtet wird:

von starlette. applications import Starlette
from starlette. responses import plainTextResponse (englisch)
von starlette. endpoints import HTTPENdpoint
von starlette. routing import Route


Die Klassen-Homepage (HTTPENDpoint):
    async def get (self, request): oder
        return PlainTextResponse (f "Hallo, Welt!")


Benutzerklasse (HTTPENDpoint):
    async def get (self, request): oder
        username = request. path_params VARITIA 'username'][Benutzername]
        return PlainTextResponse (für "Hello,{username}")

Die Bahn […]
    Route ("/", Webseite),
    Route („/{username}", Benutzer)
]

Starlette (Routen = Routen) Bearbeiten

Für alle Anforderungsmethoden, die nicht dem entsprechenden Handler zugeordnet sind, antwortet die HTTP-Endpunktklasse mit der Antwort "405 Method Not Allowed".

WebSocket im Überblick

Die WebSocketEndpoint-Klasse ist eine ASGI-Anwendung , die einen Wrapper um die Funktionalität von WebSocket-Instanzen herum bereitstellt .

Am letzten Beispiel kann man durch .scope Zugriff auf einen ASGI-Verbindungsbereich und er hat eine Eigenschaft encoding , um dort on_receive Die erwarteten WebSocket-Daten werden in der Methode überprüft, und die Eigenschaft kann optional festgelegt werden.

Codierungstypen sind :

  • 'json'
  • 'bytes'
  • 'text'

Es gibt drei schreibbare Möglichkeiten , bestimmte ASGI WebSocket-Nachrichtentypen zu verarbeiten :

  • async def on_connect(websocket, **kwargs)
  • async def on_receive(websocket, data)
  • async def on_disconnect(websocket, close_code)

    from starlette . endpoints import WebSocketEndpoint (englisch)

    Klasse App (WebSocketEndpoint) : Encoding = ' Bytes ' eingeben

    async def auf _ connect (self , websocket) :
        Websocket aufrufen . accept ()
    
    async def auf _ receive (self , websocket , data) :
        await websocket . send _ bytes (b " Nachricht : " + Daten)
    
    async def auf _ disconnect (self , websocket , close _ code) :
        Durchreise
    

WebSocketEndpoint kann auch mit der Starlette-Anwendungsklasse verwendet werden :

Import von Uvicorn
von starlette . applications import Starlette
von starlette . endpoints import WebSocketEndpoint , HTTPEndpoint
from starlette . responses import HTMLResponse (englisch)
von starlette . routing import route , WebSocketRoute


Mit html = " "
<!DOCTYPE html>
<html>
    <head>
        <title>Der Chat</title>
    </head>
    <body>
        <h1>Der WebSocket Chat</h1>
        <form action="" onsubmit="sendMessage(event)">
            <input type="text" id="messageText" autocomplete="off"/>
            <button>Senden Sie</button>
        </form>
        <ul id='messages'>
        </ul>
        <script>
            var ws = new WebSocket (" ws ://localhost : 8000/ws ") ;
            ws . onmessage = function (Veranstaltung) {
                var messages = document . getElementById ('messages')
                var message = document . createElement ('li') [ Nachricht schreiben ]
                Inhalt : Die Datei " CreateText-Datei " (event.data)
                message . appendChild (Inhalt)
                messages . appendChild (Nachrichten)
            };
            function sendMessage (Ereignis) {
                var input = document . getElementById (" messageText ")
                ws . send (Eingabe . Wert)
                Eingabe . Wert = ' '
                event . preventDefault () Bearbeiten
            }
        </script>
    </body>
</html>
"""

Die Klassen-Homepage (HTTPENDpoint) :
    async def get (self , request) : oder
        zurück HTMLResponse (html)

Klasse Echo (WebSocketEndpoint) :
    Encoding = " Text " (Text eingeben)

    async def auf _ receive (self , websocket , data) :
        await websocket . send _ text (f " Nachrichtentext was :{data}")

Die Bahn [ … ]
    Route ("/" , Webseite) ,
    WebSocketRoute ("/ws " , Echo) Bearbeiten
]

Starlette (Routen = Routen) Bearbeiten