Рубрики
Без рубрики

Простое приложение чата с использованием веб -билетов с FastApi

Эй, ребята, здесь я снова возится с Fastapi. На этот раз я буду пытаться построить чрезвычайно простые … Tagged с Fastapi, Python, Websocket.

FOSTAPI (4 серии деталей)

Эй, ребята, здесь я снова возится с Fastapi. На этот раз я буду пытаться построить Чрезвычайно просто чат веб приложение. Я буду использовать ВЕБ -ОКОКА с FASTAPI.

Полное объяснение ВЕБ -ОКОКА Понадобится целая статья, поэтому я предполагаю, что у читателя есть некоторое знакомство с этим протоколом. Это больше похоже на обновление Http вместо самого протокола.

Еще один действительный момент, который будет сделан, заключается в том, что это было результатом того, что я взломал с FASTAPI документация. Итак, в результате я не очень глубоко преподавал в лучшем подходе. В другом посте я представлю вам более зрелый подход к этой проблеме. На данный момент давайте просто повеселимся.

Что мы хотим построить? Частичное описание требований.

Прежде чем мы начнем кодирование, давайте сначала подумаем, что мы хотим сделать. Что ж, идея состоит в том, чтобы создать простую веб -страницу, которая имитирует поведение чата.

Желаемое поведение:

  • Откройте страницу в браузере.
  • Все клиенты, подключенные к одному и тому же URL, но через разные браузеры могут пообщаться между ними.

Основной дизайн поведения

Client1 и Client2 подключаются к URL, скажем, это http://localhost: 8000 Анкет После этого соединения каждое сообщение от Client1 будет транслироваться другим клиентам, подключенным к Комната , в этом случае будет клиентом2. Таким образом, широкий взгляд на рисунок был бы похож на картинке ASCII:

   Client 1

     ___T_                              SERVER (FastAPI)
    | O O |                             +---------+
    |__n__|           Message 1         |         |
 >===]__o[===<    --------------->      |         |
     [o__]            Message 2         |         |
     ]| |[        <--------------       |         |
    [_| |_]                             |         |
                                        |         |
                                        |         | 
   Client 2                             |         |
                                        |         |
     ___T_                              |         |
    | O O |                             |         |
    |__n__|          Message 2          |         |
 >===]__o[===<   --------------->       |         |
     [o__]           Message 1          |         |
     ]| |[       <--------------        |         |
    [_| |_]                             +---------+

Робот ASCII сгенерирован с Go-Asciibot

Клиент 1 Отправить сообщение на сервер, сервер транслирует сообщение другим клиентам на номер .

Требования

  • FASTAPI
$ pip install fastapi
  • Uvicorn
$ pip install uvicorn

Код сервера

Давайте прыгнем в код. Я разделю его на два раздела, один для кода сервера, а другой для клиентского кода.

Ну, как я уже говорил ранее, мне понадобится конечная точка, чтобы служить Html Страница, что в этом случае будет содержать код клиента. Так что нам нужно научиться служить Html с FASTAPI . Наш HTML -код будет в файле index.html , в той же папке, что и main.py Анкет

from fastapi import FastAPI

app = FastAPI()

html = ""
with open('index.html', 'r') as f:
    html = f.read()

@app.get("/")
async def get():
    return HTMLResponse(html)

Так что здесь происходит? Сначала мы делаем простой импорт FASTAPI Класс, чтобы иметь возможность создавать наше приложение. Рядом с этим мы читаем содержание index.html Подайте и сохраните его контент в переменной с именем html Анкет Должен быть лучший способ сделать это, но для нашего случая это решает наши проблемы.

Вам может быть интересно, что такое содержание Html Файл, мы посмотрим, не волнуйтесь.

И на последнее время мы определяем нашу конечную точку, где мы можем получить доступ к содержанию index.html файл. Таким образом, если вы посетите http://localhost: 8000 Браузер отобразит Html Анкет

Так что же дальше? До сих пор мы только можем отображать содержание Html , но мы еще не справились с другими ситуациями, верно? Как мы отличаем клиента от другого? Давайте решим это.

from typing import List
from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse

class ConnectionManager:
    def __init__(self):
        self.connections: List[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.connections.append(websocket)

    async def broadcast(self, data: str):
        for connection in self.connections:
            await connection.send_text(data)


manager = ConnectionManager()


@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
    await manager.connect(websocket)
    while True:
        data = await websocket.receive_text()
        await manager.broadcast(f"Client {client_id}: {data}")

Класс под названием ConnectionManager , как следует из названия, – это класс, который мы собираемся использовать для обработки подключения разных клиентов.

  • подключить Метод на этом классе, возьмите в качестве аргумента клиент WebSocket. Этот клиент начинает принимать сообщение из браузера и добавляется в список со всеми клиентами.
  • трансляция Метод, возьмите как аргумент A Сообщение и транслировать свой контент любому другому клиенту на номер .

Каждый клиент подключится к http://localhost: 8000/ws/{client_id} , где {client_id} будет целым числом, которое идентифицирует этого клиента. После того, как он будет подключен, он начнет принимать сообщения из браузера. Любое из этого сообщения будет транслироваться позже любому клиенту на номер .

Клиентский код

Теперь приходит к коду клиента, что в нашем случае будет Html код.




    
        Chat
    
    
        

WebSocket Chat

UPS!! Это много информации, так что давайте разберем ее и постараемся понять хотя бы самые важные части. Чистый Html , имеет два основных компонента, форма и кнопка Анкет

  • кнопка Анкет После нажатия кнопка будет скрыта от клиента, а форма будет видим. Только это больше нет трюков. Это делается через JavaScript , на Showform метод

  • форма , содержит поле ввода, где написаны сообщения, и отправить кнопка, которая запустит метод Sendmessage На стороне JavaScript.

После того, как мы нажимаем на отправить Кнопка, мы отправим текст на сервер, используя подключение к WebSocket. Таким образом, когда сервер получает сообщение, он будет транслировать его любому другому клиенту на номер .

uvicorn main:app --reload

-переоценивать Флаг должен быть в состоянии восстановиться при сбое, очень полезен.

Это все люди, и, безусловно, необходимо улучшить мои навыки письма, в то время как я буду продолжать практиковать.

Откройте как минимум два веб -браузера и подключитесь к Localhost: 8000

FOSTAPI (4 серии деталей)

Оригинал: “https://dev.to/gealber/simple-chat-application-using-websockets-with-fastapi-3gn7”