自動化無しに生活無し

WEB開発関係を中心に備忘録をまとめています

  • FastAPIでWebSocketを実現する

    djangoでもWebSocketは実現できるが、依然djangoの一部は同期動作(DB操作とMIDDLEWARE)。 よって、どうしてもボトルネックが発生する。 そこでWebSocketは、djangoではなく、非同期処理を前提として作られたFastAPIに委ねることで、より高速なWebSocketを実現させる。 本記事では、FastAPIを使ってのWebSocketを実現させる。 ただし、セキュリティ ...
  • 【Sec-Websocket-Protocol】DRF+ReactのSPAでWebsocketのチャットサイトでJWT認証をする

    DRF+ReactのSPAでWebsocketのチャットサイトをつくる と DRF+ReactのCRUD簡易掲示板SPAでJWT認証を実装する の続き。 今回は、先にSPAでJWT認証を済ませたうえで、WebSocketを行うようにした。Sec-WebSocket-Protocol を使っている。 トークンの検証が煩雑になるため、WebSocketのメッセージ部にJWTトークンは含ませない設計にした。 WebS ...
  • Django-channelsのAsyncWebsocketConsumerのscopeの内容【JWT認証+Sec-Websocket-Protocol】

    AsyncWebsocketConsumer の scope の内容は以下の通り。 ただし、JWT認証をしており、Sec-Websocket-Protocol を使用している。 { 'type': 'websocket', 'path': '/ws/chat/1/', 'raw_path': b'/ws/chat/1/', 'root_path': '', 'headers': [ (b'host', b'localhost:8000'), (b'user-agent', b'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0'), (b'accept', b'*/*'), (b'accept-language', b'ja,en-US;q=0.7,en;q=0.3'), (b'accept-encoding', b'gzip, deflate, br, zstd'), (b'sec-websocket-version', b'13'), (b'origin', b'http://localhost:3000'), (b'sec-websocket-protocol', b'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzM3MTg4NDg5LCJpYXQiOjE3MzcxODgzNDUsImp0aSI6IjI0OWRlMTUzMjY0YTQ4ZDE5YWVkZDJiODlhNTgwY2M5IiwidXNlcl9pZCI6MX0.hzS0uwx4LhPlM6wFJiIUpEkjVjkGpV87psw5MD1leyk'), (b'sec-websocket-extensions', b'permessage-deflate'), (b'sec-websocket-key', b'Q257WDS+ETm8KNLmj6cQiQ=='), (b'dnt', b'1'), (b'sec-gpc', b'1'), (b'connection', b'keep-alive, Upgrade'), (b'cookie', b'csrftoken=8ShA2y6HDOr794MF0TdrSnbEv76KCY0Y; _ga_HDX0LW64ZT=GS1.1.1737184513.53.1.1737184805.0.0.0;'), (b'sec-fetch-dest', b'empty'), (b'sec-fetch-mode', b'websocket'), (b'sec-fetch-site', b'same-site'), (b'pragma', b'no-cache'), (b'cache-control', b'no-cache'), (b'upgrade', b'websocket') ], 'query_string': b'', 'client': ['127.0.0.1', 35492], 'server': ['127.0.0.1', 8000], 'subprotocols': ['eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzM3MTg4NDg5LCJpYXQiOjE3MzcxODgzNDUsImp0aSI6IjI0OWRlMTUzMjY0YTQ4ZDE5YWVkZDJiODlhNTgwY2M5IiwidXNlcl9pZCI6MX0.hzS0uwx4LhPlM6wFJiIUpEkjVjkGpV87psw5MD1leyk'], 'asgi': {'version': '3.0'}, 'user': <User: asahina>, 'path_remaining': '', 'url_route': {'args': (), 'kwargs': {'room_name': '1'}} } ユーザーエージェントやCookieのデータも含まれる。 今回、ミドルウェアなどで操作しているため、状況によっ ...
  • DRF+ReactのSPAでWebsocketのチャットサイトをつくる

    タイトル通り、Django REST FrameworkとReactのSPAで、WebSocketを使ったチャットサイトを作った。 以前のWebSocket搭載チャットサイト(下記)はReactを使っていないため、SPAではない。今回はReactを搭載したSPAとしている。 DjangoでWebSocketを使って、チャットサイトを作る ただし、今回はJWT認証の実装は見送った。理由は後述。 開発要件 WebSock ...
  • DjangoでWebSocketを使って、チャットサイトを作る

    django-channelsを使ってWebSocketを実現させる【チャットサイト開発に】 ここで、チャットサイトを作ったが、ページリロードで全て消えてしまう。 チャンネルレイヤーにメッセージを与えるだけでなく、DBにも記録するように仕立てた。 consumers.py import json from channels.generic.websocket import AsyncWebsocketConsumer from asgiref.sync import sync_to_async from .forms import ChatLogForm from django.utils import timezone class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): self.room_name = self.scope['url_route']['kwargs']['room_name'] self.room_group_name = 'chat_%s' % self.room_name await self.channel_layer.group_add( self.room_group_name, self.channel_name ) await self.accept() async def disconnect(self, close_code): await self.channel_layer.group_discard( self.room_group_name, self.channel_name ) async def receive(self, text_data): text_data_json = json.loads(text_data) message = text_data_json['message'] chat_log = await self.save_chat_log(message) if chat_log == None: return False local_created_at = timezone.localtime(chat_log.created_at) created_at_str = local_ ...
  • django-channelsを使ってWebSocketを実現させる【チャットサイト開発に】

    django-channelsのチュートリアルに倣って、WebSocketのチャットサイトを作った。 とても実装難易度が高い。実装手順の備忘録として本記事をまとめる。 解説 ライブラリのインストール pip install django channels daphne djangoとdjango-channels、それからdaphne(ダフネ)をインストールする。 daphneは ASGI(Asynchronous Server Gateway Interface)に準拠したサーバー。 config/settings.py """ Django settings for ...