fastapi/docs/tr/docs/advanced/websockets.md

5.9 KiB
Raw Blame History

WebSockets

FastAPI ile WebSockets kullanabilirsiniz.

websockets Kurulumu

Bir sanal ortam oluşturduğunuzdan, onu aktive ettiğinizden ve websockets'i ("WebSocket" protokolünü kullanmayı kolaylaştıran bir Python kütüphanesi) kurduğunuzdan emin olun:

$ pip install websockets

---> 100%

WebSockets client

Production'da

Production sisteminizde muhtemelen React, Vue.js veya Angular gibi modern bir framework ile oluşturulmuş bir frontend vardır.

WebSockets kullanarak backend'inizle iletişim kurmak için de büyük ihtimalle frontend'inizin sağladığı yardımcı araçları kullanırsınız.

Ya da native kod ile doğrudan WebSocket backend'inizle iletişim kuran native bir mobil uygulamanız olabilir.

Veya WebSocket endpoint'i ile iletişim kurmak için başka herhangi bir yönteminizi de kullanıyor olabilirsiniz.


Ancak bu örnek için, tamamı uzun bir string içinde olacak şekilde biraz JavaScript içeren çok basit bir HTML dokümanı kullanacağız.

Elbette bu optimal değil ve production için kullanmazsınız.

Production'da yukarıdaki seçeneklerden birini kullanırsınız.

Ama WebSockets'in server tarafına odaklanmak ve çalışan bir örnek görmek için en basit yol bu:

{* ../../docs_src/websockets_/tutorial001_py310.py hl[2,6:38,41:43] *}

Bir websocket Oluşturun

FastAPI uygulamanızda bir websocket oluşturun:

{* ../../docs_src/websockets_/tutorial001_py310.py hl[1,46:47] *}

/// note | Teknik Detaylar

from starlette.websockets import WebSocket da kullanabilirsiniz.

FastAPI, geliştirici olarak işinizi kolaylaştırmak için aynı WebSocket'i doğrudan sağlar. Ancak aslında doğrudan Starlette'ten gelir.

///

Mesajları await Edin ve Mesaj Gönderin

WebSocket route'unuzda mesajları await edebilir ve mesaj gönderebilirsiniz.

{* ../../docs_src/websockets_/tutorial001_py310.py hl[48:52] *}

Binary, text ve JSON verisi alıp gönderebilirsiniz.

Deneyin

Kodunuzu main.py dosyasına koyun ve ardından uygulamanızı çalıştırın:

$ fastapi dev

<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Tarayıcınızda http://127.0.0.1:8000 adresini açın.

Şuna benzer basit bir sayfa göreceksiniz:

Input kutusuna mesaj yazıp gönderebilirsiniz:

Ve WebSockets kullanan FastAPI uygulamanız yanıt döndürecektir:

Birçok mesaj gönderebilir (ve alabilirsiniz):

Ve hepsinde aynı WebSocket bağlantısı kullanılacaktır.

Depends ve Diğerlerini Kullanma

WebSocket endpoint'lerinde fastapi içinden import edip şunları kullanabilirsiniz:

  • Depends
  • Security
  • Cookie
  • Header
  • Path
  • Query

Diğer FastAPI endpoint'leri/path operations ile aynı şekilde çalışırlar:

{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}

/// info

Bu bir WebSocket olduğu için HTTPException raise etmek pek anlamlı değildir; bunun yerine WebSocketException raise ederiz.

Spesifikasyonda tanımlanan geçerli kodlar arasından bir kapatma kodu kullanabilirsiniz.

///

Dependency'lerle WebSockets'i Deneyin

Uygulamanızı çalıştırın:

$ fastapi dev

<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Tarayıcınızda http://127.0.0.1:8000 adresini açın.

Burada şunları ayarlayabilirsiniz:

  • path'te kullanılan "Item ID".
  • query parametresi olarak kullanılan "Token".

/// tip

query'deki token değerinin bir dependency tarafından ele alınacağına dikkat edin.

///

Bununla WebSocket'e bağlanabilir, ardından mesaj gönderip alabilirsiniz:

Bağlantı Kopmalarını ve Birden Fazla Client'ı Yönetme

Bir WebSocket bağlantısı kapandığında, await websocket.receive_text() bir WebSocketDisconnect exception'ı raise eder; ardından bunu bu örnekteki gibi yakalayıp (catch) yönetebilirsiniz.

{* ../../docs_src/websockets_/tutorial003_py310.py hl[79:81] *}

Denemek için:

  • Uygulamayı birden fazla tarayıcı sekmesiyle açın.
  • Bu sekmelerden mesaj yazın.
  • Sonra sekmelerden birini kapatın.

Bu, WebSocketDisconnect exception'ını raise eder ve diğer tüm client'lar şuna benzer bir mesaj alır:

Client #1596980209979 left the chat

/// tip

Yukarıdaki uygulama, birden fazla WebSocket bağlantısına mesajları nasıl yönetip broadcast edeceğinizi göstermek için minimal ve basit bir örnektir.

Ancak her şey memory'de, tek bir list içinde yönetildiği için yalnızca process çalıştığı sürece ve yalnızca tek bir process ile çalışacaktır.

FastAPI ile kolay entegre olan ama Redis, PostgreSQL vb. tarafından desteklenen daha sağlam bir şeye ihtiyacınız varsa encode/broadcaster'a göz atın.

///

Daha Fazla Bilgi

Seçenekler hakkında daha fazlasını öğrenmek için Starlette dokümantasyonunda şunlara bakın: