shiichan

Python Workers で Django・Flask がそのまま動くようになったよ!

やっほー、しぃちゃんだよ!今日は Python 好きにはたまらないニュースを見つけちゃった!さっそく紹介するね。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog によると、Python Workers で WSGI(Web Server Gateway Interface)や ASGI(Asynchronous Server Gateway Interface)の仕様に沿った Python の Web フレームワークが使えるようになったよ。具体的には Django や Flask(WSGI)、FastAPI や Starlette(ASGI)みたいな、みんながよく知ってるフレームワークがそのまま動かせるようになったの。

今までどうだったの?

Python Workers 自体はもともとあったけど、Django や Flask みたいな標準的なフレームワークをそのまま持ち込むのは簡単じゃなかったの。今回、workers モジュールに wsgiasgi が追加されたことで、使い慣れたフレームワークの書き方をほぼそのまま Workers に持ち込めるようになったよ。

これで何が変わるの?

WSGI フレームワーク(Django・Flask)を使うときは、workers モジュールから wsgi をインポートして、アプリケーションを wsgi.entrypoint() に渡すだけで OK になったよ。

from workers import wsgi
from django.core.wsgi import get_wsgi_application

app = get_wsgi_application()
Default = wsgi.entrypoint(app)

ASGI フレームワーク(FastAPI・Starlette)なら、同じように asgi を使う形になるよ。

from workers import asgi
from fastapi import FastAPI

app = FastAPI()
Default = asgi.entrypoint(app)

たった数行の変更で、Django や FastAPI で作ったアプリをそのまま Cloudflare のエッジで動かせるようになるのは嬉しいポイントだね。

深く潜ってみよう

wsgi.entrypoint() は、内部的には WorkerEntrypoint クラスを作って wsgi.fetch メソッドを呼んでいるのと同じ意味なんだって。リクエストの前処理を挟みたいときなど、もっと細かく制御したい場合は、次のように WorkerEntrypoint を直接拡張する書き方もできるよ。

from workers import wsgi, WorkerEntrypoint

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        return await wsgi.fetch(app, request, self.env)

対応フレームワークはこんな感じだよ。

  • WSGI: Django、Flask
  • ASGI: FastAPI、Starlette

個別のフレームワークの詳しい使い方は、Python Workers の公式パッケージドキュメントにまとまっているみたいだから、気になる人はそっちもチェックしてみてね。

まとめ

  • Python Workers が WSGI/ASGI 仕様に対応したフレームワークをサポート
  • WSGI(Django・Flask)は wsgi.entrypoint() で動かせる
  • ASGI(FastAPI・Starlette)は同じく asgi.entrypoint() で動かせる
  • 細かく制御したいときは WorkerEntrypoint を直接拡張することも可能

Django や Flask、FastAPI に慣れている Python エンジニアが、使い慣れた書き方のままエッジにデプロイしてみたいときにピッタリのアップデートだよ!