自動化無しに生活無し

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

  • 【Django】DBの保存(投稿と編集)、削除に対して任意の動作をする【signals】

    モデルの保存時、削除時に任意の動作をしたい時、モデルのsaveメソッドをオーバーライドするなどで対応できる。 DjangoでDBへデータ格納時(save)、削除時(delete)に処理を追加する【models.py、forms.py、serializer.pyのメソッドオーバーライド】 ただ、別のモデルに対しても同じ処理を実行したい時、モデルの外部で処理をしたい場合などでは、singalsを使う。 実装 ...
  • Pythonで処理速度のボトルネックを特定する

    Pythonの高速化には、ボトルネックの特定と改善が必要。 本記事ではボトルネックの特定をする。 関数の処理速度を調べるデコレータを用意する 以下のコードの関数をデコレータとして使うことで関数の処理時間を調べることができる。 from functools import wraps import time def timefn(fn): @wraps(fn) def meassure_time(*args, **kwargs): start = time.time() result = fn(*args, **kwargs) print(f"@timefn デコレータより {fn.__name__} : {time.time() - start} 秒") return result return meassure_time try_count = 10000000 @timefn def create_numbers_for(): numbers = [] for i in range(try_count): numbers.append(i) create_numbers_for() このtimefnはデコレータとして機能する。 def timefn(fn): @wraps(fn) def meassure_time(*args, **kwargs): start = time.time() result ...
  • Python非同期プログラミングのルール

    非同期プログラミングには守るべきルールがある。 同期プログラミングと同じように作るとエラーが出るため、ルール・作法をここにまとめる。 非同期処理のルール一覧 I/Oバウンドな同期処理は非同期処理にする 非同期関数を定義するには、async def 非同期関数を実行するには、await 同期関数から非同期関数を実行するには、 asyncio.run() 非同期関数をまとめて実行するには、 asyncio.gather() 同期関数を非同期化させるには、@sync_to_asyn ...
  • FastAPIでDjangoのORMを使う

    Djangoの処理の一部をFastAPIで分離、FastAPI内でDjangoのORMを使ってDBの読み込みをする。 実装方法と手順 FastAPIでDjangoの設定を読み込み Djangoのモデルをimportする sync_to_asyncデコレータでラップされた関数内でモデルを使う モデルオブジェクトをそのままreturn してはいけない。 FastAPIでDjangoの設定を読み込み まず、FastAP ...
  • 非同期リクエスト vs マルチスレッドリクエスト vs 直列リクエスト

    先の記事でI/Oバウンドの処理は、非同期処理が最適であるとわかった。 本記事では、それがはっきりとわかるコードを用意した。 非同期で大量のリクエストを送信し、レスポンスを受け取る。その処理時間を計測する。 比較のため、マルチスレッド、直列動作のコードも用意した。 使用ライブラリ pip install aiohttp requests fastapi uvicorn aiohappyeyeballs==2.4.4 aiohttp==3.11.11 aiosignal==1.3.2 annotated-types==0.7.0 anyio==4.8.0 async-timeout==5.0.1 attrs==25.1.0 certifi==2024.12.14 charset-normalizer==3.4.1 click==8.1.8 exceptiongroup==1.2.2 fastapi==0.115.7 frozenlist==1.5.0 h11==0.14.0 idna==3.10 multidict==6.1.0 propcache==0.2.1 pydantic==2.10.6 pydantic_core==2.27.2 requests==2.32.3 sniffio==1.3.1 starlette==0.45.3 typing_extensions==4.12.2 urllib3==2.3.0 uvicorn==0.34.0 yarl==1.18.3 非同期リクエストには、aiohttp を使う。通常の requests では非同期リク ...
  • 非同期処理(async、await)とマルチスレッド(threading)とマルチプロセス(multiprocessing)の違い

    FastAPIやWebSocketで非同期処理を扱うようになったため、非同期処理とマルチスレッドとマルチプロセスの違いをまとめる。 この違いは非常に複雑で難解。 まずはPythonのGILについて解説する。 GIL とは? Global Interpreter Lock の略。pythonのCPython実装時に追加された、スレッドの排他制御メカニズムのこと。 このGILの仕組みにより、複数のスレッドがPythonのオブジェクトにアクセスできないようにし ...
  • FastAPIでHelloworldとインストール

    FastAPI とは? FastAPIは、高性能なウェブアプリケーションフレームワークで、Python3.8以上で動く。APIサーバーをつくることができる。 非同期(ASGI)をネイティブにサポートしているため、1スレッドで複数のリクエストを捌くことができる。 FastAPIでは非同期対応により、I/O待機時間を減らし、CPUリソースをフル活用できる。 インストール pip install fastapi uvicorn main.py をつくる from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "Hello, World!"} サーバー ...
  • 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のCRUD簡易掲示板SPAでJWT認証を実装する

    DRF+ReactのSPAでCRUD簡易掲示板をつくる このDRF+ReactのCRUD簡易掲示板SPAに、JWT認証を実装する。 なぜなら、JWT認証を実装しない場合、通常のDjangoのセッションベースの認証を実装する場合では、CSRF検証が必要になるから。 開発要件 JWT認証を実装する( CSRF検証の廃止 ) ログイン、ログアウト、トークンの更新、アカウント新規作成の機能 ユーザー名とパスワードを使用し ...
  • 【React】Contextとカスタムフックでログイン・ログアウト、認証状態を扱う

    Reactで全てのコンポーネントでStateや関数を扱いたい場合がある。 propsを使う場合はバケツリレーになってしまい、見通しが悪くなる。 そこで、Contextを使い、全コンポーネントでStateや関数を使えるようにする。 【React】グローバルなStateを使って、Propsバケツリレー問題を解決する 更に、カスタムフックを使えば呼び出しやすくなる。 src/AuthContext.jsx まずはcreateContextで、コンテキ ...