Lewati ke isi

Endpoint

Starlette berisi kelas HTTPEndpoint dan WebSocketEndpoint, yang menyediakan pola tampilan berbasis kelas untuk menangani penjadwalan metode HTTP dan sesi WebSocket.

Titik akhir HTTP

HTTPEndpoint Kelas dapat digunakan sebagai aplikasi ASGI:

Dari pemula. Tanggapan impor PlainTextResponse
Dari starlette.endpoints impor HTTPEndpoint


Aplikasi Kelas (HTTPEndpoint):
    Aync pasti mendapatkan (diri, permintaan):
        Mengembalikan PlainTextResponse (f "Halo, dunia!")

Jika Anda menggunakan instance aplikasi Starlette untuk menangani perutean, Anda dapat menjadwalkan ke a HTTPEndpoint Kelas. Pastikan untuk menjadwalkan ke kelas itu sendiri, bukan contoh kelas:

Starlette.application diimpor dari Starlette
Dari pemula. Tanggapan impor PlainTextResponse
Dari starlette.endpoints impor HTTPEndpoint
Dari starlette. rute impor routing


Beranda Kelas (HTTPEndpoint):
    Aync pasti mendapatkan (diri, permintaan):
        Mengembalikan PlainTextResponse (f "Halo, dunia!")


Pengguna Kelas (HTTPEndpoint):
    Aync pasti mendapatkan (diri, permintaan):
        Nama pengguna = permintaan. path _ params ['nama pengguna']
        Mengembalikan PlainTextResponse (f "Halo,{username}")

Rute = [
    Rute ("/," Beranda),
    Rute ("/{username}," Pengguna)
]

Aplikasi = Starlette (rute = rute)

Untuk metode permintaan apa pun yang tidak dipetakan ke pawang yang sesuai, kelas titik akhir HTTP akan merespons dengan respons "405 metode tidak diizinkan."

Titik akhir WebSocket

WebSocketEndpoint Kelas adalah aplikasi ASGI yang berputar di sekitar WebSocket Fungsionalitas instance menyediakan pembungkus.

Rentang koneksi ASGI dapat diakses melalui .scope pada contoh titik akhir, dan memiliki encoding properti yang secara opsional dapat diatur untuk memvalidasi data WebSocket yang diharapkan dalam metode on_receive.

Jenis pengkodean adalah:

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

Ada tiga metode yang dapat ditulis ulang untuk menangani jenis pesan WebSocket ASGI tertentu:

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

    Dari starlette.endpoints impor WebSocketEndpoint

    Aplikasi Kelas (WebSocketEndpoint): Pengkodean = 'bytes'

    Aync def on _ connect (self, websocket):
        Tunggu websocket.terima ()
    
    Async def on _ accept (self, websocket, data):
        Tunggu websocket send _ bytes (b "Pesan:" + data)
    
    Async def di _ putuskan sambungan (sendiri, websocket, close _ code):
        Lulus
    

WebSocketEndpoint juga dapat digunakan dengan kelas aplikasi Starlette:

Impor uvicorn
Starlette.application diimpor dari Starlette
Dari starlette.endpoints impor WebSocketEndpoint, HTTPEndpoint
Dari pemula. Tanggapan impor HTMLResponse
Dari bintang. rute impor Rute, WebSocketRoute


HTML = ""
<! DOCTYPE html >
<html>
    <head>
        <title>Obrolan</title>
    </head>
    <body>
        <h1>Obrolan WebSocket</h1>
        <form action="" onsubmit="sendMessage(event)">
            <input type="text" id="messageText" autocomplete="off"/>
            <button>Kirim</button>
        </form>
        <ul id='messages'>
        </ul>
        <script>
            Var ws = WebSocket baru ("ws://localhost:8000/ws");
            Ws.onMessage = fungsi (acara) {
                Pesan var = dokument.getElementById ('pesan')
                Var message = dokument.createElement ('li')
                Var content = dokument.createTextNode (event.data)
                Pesan.appendChild (konten)
                Pesan.Lampiran Anak (pesan)
            };
            Fungsi mengirim Pesan (acara) {
                Masukan var = dokument.getElementById ("teks pesan")
                Ws.send (nilai input)
                Nilai input = "
                Event.preventDefault ()
            }
        </script>
    </body>
</html>
"""

Beranda Kelas (HTTPEndpoint):
    Aync pasti mendapatkan (diri, permintaan):
        Mengembalikan Respons HTML (html)

Gema Kelas (WebSocketEndpoint):
    Pengkodean = "teks"

    Async def on _ accept (self, websocket, data):
        Tunggu websocket send _ text (f "Teks pesan adalah:{data}")

Rute = [
    Rute ("/," Beranda),
    WebSocketRoute ("/ ws," Echo)
]

Aplikasi = Starlette (rute = rute)