Ga naar inhoud

Endpoints

Starlette bevat de klassen HTTPEndpoint en WebSocketEndpoint, die een op klassen gebaseerd weergavepatroon bieden voor het afhandelen van HTTP-methodeplanning en WebSocket-sessies.

HTTP-eindpunt

HTTPEndpoint Klassen kunnen worden gebruikt als ASGI-toepassingen:

Vanaf starlette.reacties importeren PlainTextResponse
Vanuit starlette.endpoints HTTPEndpoint importeren


Klasse-app (HTTPEndpoint):
    Aync def get (zelf, verzoek):
        Retourneert PlainTextResponse (f "Hallo, wereld!")

Als u een Starlette-toepassingsinstantie gebruikt om routing af te handelen, kunt u plannen naar een HTTPEndpoint-klasse. Zorg ervoor dat u plant naar de klasse zelf, niet naar een instantie van de klasse:

Starlette.applicaties importeren vanuit Starlette
Vanaf starlette.reacties importeren PlainTextResponse
Vanuit starlette.endpoints HTTPEndpoint importeren
Van starlette. routing importeren Route


Klasse Startpagina (HTTPEndpoint):
    Aync def get (zelf, verzoek):
        Retourneert PlainTextResponse (f "Hallo, wereld!")


Klassegebruiker (HTTPEndpoint):
    Aync def get (zelf, verzoek):
        Gebruikersnaam = aanvraag. path _ params ['gebruikersnaam']
        Retourneert PlainTextResponse (f "Hallo,{username}")

Routes = [
    Route ("/", Startpagina),
    Route ("/{username}", Gebruiker)
]

App = Starlette (routes = routes)

Voor elke aanvraagmethode die niet is toegewezen aan de corresponderende handler, zal de HTTP-eindpuntklasse reageren met een antwoord "405-methode niet toegestaan".

WebSocket eindpunt

WebSocketEndpoint Een klasse is een ASGI applicatie die draait om WebSocket De functionaliteit van de instantie biedt een wrapper.

Het ASGI-verbindingsbereik is toegankelijk via .scope op de eindpuntinstantie en heeft een eigenschap encoding die optioneel kan worden ingesteld om de verwachte WebSocket-gegevens in de on_receive-methode te valideren.

Het coderingstype is:

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

Er zijn drie herschrijfbare methoden voor het afhandelen van specifieke ASGI WebSocket-berichttypen:

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

    Vanuit starlette.endpoints importeren WebSocketEndpoint

    Klasse App (WebSocketEndpoint): Codering = 'bytes'

    Aync def on _ connect (zelf, websocket):
        Wacht op websocket.accepteer ()
    
    Async def op _ ontvangen (zelf, websocket, data):
        Wacht op websocket send _ bytes (b "Bericht:" + gegevens)
    
    Async def on _ disconnect (zelf, websocket, close _ code):
        Pas voor
    

WebSocketEndpoint kan ook worden gebruikt met de Starlette-toepassingsklasse:

Uvicorn importeren
Starlette.applicaties importeren vanuit Starlette
Importeer vanuit starlette.endpoints WebSocketEndpoint, HTTPEndpoint
Uit starlette.reacties importeren HTMLResponse
Van starlette. routing importeren Route, WebSocketRoute


HTML = ""
<! DOCTYPE html >
<html>
    <head>
        <title>Chatten</title>
    </head>
    <body>
        <h1>WebSocket Chatten</h1>
        <form action="" onsubmit="sendMessage(event)">
            <input type="text" id="messageText" autocomplete="off"/>
            <button>Verzenden</button>
        </form>
        <ul id='messages'>
        </ul>
        <script>
            Var ws = nieuwe WebSocket ("ws://localhost:8000/ws");
            Ws.onMessage = functie (gebeurtenis) {
                Var berichten = document.getElementById ('berichten')
                Naar message = document.createElement ('li')
                Var content = document.createTextNode (event.data)
                Bericht.appendKind (inhoud)
                Berichten.appendKind (bericht)
            };
            Functie sendMessage (event) {
                Var input = document.getElementById ("berichttekst")
                Ws.send (invoerwaarde)
                Inputwaarde = "
                Event.preventStandaard ()
            }
        </script>
    </body>
</html>
"""

Klasse Startpagina (HTTPEndpoint):
    Aync def get (zelf, verzoek):
        Geeft HTMLResponse (html) terug

Klasse Echo (WebSocketEndpoint):
    Codering = "tekst"

    Async def op _ ontvangen (zelf, websocket, data):
        Wacht op websocket send _ text (f "Berichttekst was:{data}")

Routes = [
    Route ("/", Startpagina),
    WebSocketRoute ("/ ws", Echo)
]

App = Starlette (routes = routes)