Pythonがデータサイエンスの分野でのみ人気があると思われる場合は、意見を訂正してください!Python Web開発には、非常にエキサイティングな新しい非同期フレームワークがあります。
現在、Python Web開発エコシステムでは多くのエキサイティングなことが起こっています。この作業の主要なドライバーの1つはASGI(非同期標準ゲートウェイインターフェイス)です。
私はここで何度もASGIについて言及しましたが、特にBocadilloとtartiflette-starletteを発表するときは、このライブラリーを詳細に紹介するのに時間をかけたことはありません。その後、今すぐ始めましょう!
この記事は、Python Web開発の最新の方向性に興味がある人を対象としています。ASGIとは何か、最新のPython Web開発テクノロジーとは何かを詳しく紹介します。
始める前に、最近awesome-asgiページを作成した方法でお知らせします。これは、拡大するASGIエコシステムを理解するのに役立つ非常に包括的なリストです。
これらのライブラリバージョンに関する更新は、ページで確認できます。
では、始めましょう!
すべてはasync / await構文で始まります
JavaScriptやGoとは対照的に、Pythonは最初から非同期実行を導入する言語ではありませんでした。長い間、マルチスレッドまたはマルチプロセスのみを使用するか、他の非同期ネットワークライブラリ(eventlet、gevent、Twistedなど)に依存して、Pythonでタスクを同時に実行できます。(すでに2008年の時点で、TwistedにはすでにinlineCallbacksやdeferredGeneratorなどの非同期コラボレーティブインターフェースがありました。)
しかし、これはすべてPython 3.4以降で変更されています。Python 3.4は、マルチタスクのサポートを実現するために、ジェネレーターと構文からの生成に基づいて、標準ライブラリにasyncioを追加しました。
その後、async / await構文がPython 3.5で追加されました。この文法関数に依存して、ボトムレイヤーに依存しないネイティブコルーチンを実装します。これにより、Python並行処理ライブラリを作成するための基礎が築かれます。
3.5のリリース以降、非同期ライブラリーの開発は急速に進み、コミュニティーは多くのライブラリーで非同期処理を実行しています。理解に興味があるなら、aio-libsとawesome-asyncioで多くのプロジェクトを見ることができます。
まあ、あなたはそれを推測しました-それはまた、Pythonウェブサーバーとアプリケーションが非同期に向かっていることを意味します。実際、すべてのクールなアプリがやっています!(ジャンゴでも)
ASGIの概要
では、ASGIはこれらすべてにどのように適合しますか?
より高い視点から見ると、ASGIは、Python非同期サーバーとアプリケーションが相互に通信できるようにするツールと見なすことができます。多くの設計アイデアをWSGIと共有し、通常は組み込みの非同期後継者の形で提供されます。
これは、このモデルの原理図です。
高レベルでは、ASGIはアプリケーションとサーバー間の通信インターフェースです。
しかし、実際には、これははるかに複雑です。
ASGIの真の動作原理を理解するために、ASGI仕様を見てみましょう。
ASGIには2つの異なるコンポーネントが含まれています。
- Socketプロトコルを終了し、接続と各接続のイベントメッセージに変換するプロトコルサーバー。
- プロトコルサーバーに常駐し、接続ごとに1回インスタンス化され、発生時にイベントメッセージを処理するアプリケーション。
したがって、仕様によれば、ASGIの本当のポイントは、メッセージフォーマットと、アプリケーションとそれを実行するプロトコルサーバーの間でこれらのメッセージを交換する方法です。
これで、ダイアグラムをより詳細なバージョンに変更できます。
実際のASGIの仕組み
明らかに、注目すべき多くの興味深い詳細があります。たとえば、HTTPとWebSocketの仕様を見ることができます。
さらに、仕様はサーバーとアプリケーション間の通信に重点を置いていますが、事実はASGIにはそれ以上のものが含まれていることを示しています。
これらについては後で説明しますが、最初に基本的な知識について話す必要があります...
ASGIの基礎
ASGIがPythonネットワークエコシステムにどのように適合するかを理解したところで、特定のコードを詳しく見てみましょう。
ASGIは単純な作業モデルに依存しています。クライアントがサーバーに接続すると、アプリケーションがインスタンス化されます。次に、着信データをアプリケーションに入力し、返されたすべてのデータを送り返します。
ここで言う「入力アプリケーション」は、実際にはアプリケーションを呼び出す関数を呼び出すようなものです。つまり、データを入力して出力データを返します。
実際、これはASGIアプリケーション呼び出し可能のすべての機能です。繰り返しますが、この呼び出し可能オブジェクトの形式はASGI仕様で定義されています。形式は次のとおりです。
この関数のシグネチャは、ASGIでの「I」の意味です。サーバーが呼び出す前に、アプリケーションはこのインターフェイスを実装する必要があります。
3つのパラメータについて説明します。
- スコープは、着信要求に関する情報を含む辞書です。データは、HTTP接続とWebSocket接続の間のデータとは異なります。
- receiveは、ASGIイベントメッセージを受信するために使用される非同期関数です。
- sendは、ASGIイベントメッセージの送信に使用される非同期関数です。
基本的に、これらのパラメーターを使用すると、プロトコルサーバーで実行されている通信チャネルで受信()および送信()データを受信できます。チャネルはこのコンテキストで作成されます。
私はあなたの意見を理解していませんが、このインターフェースの全体的なアイデアとデザイン形式は私の考えに非常に適しています。サンプルコードを表示します。
コードを見せて!
ASGIの正式な外観をより実際的に理解するために、uvicorn(人気のASGIサーバー)が提供するネイティブASGI HTTPアプリケーションを示す非常に小さなプロジェクトを作成しました。
ここでは、send()を使用してHTTP応答をクライアントに送信します。最初にヘッダーを送信し、次に応答本文を送信します。
さて、これらのすべての辞書と生のバイトデータがあるので、ネイティブASGIを使用するのは簡単ではないことを認めます。
幸いなことに、より高度なオプションがあります。スターレットについて話し始めるときが来ました。
Starletteは優れたプロジェクトであり、IMOはASGIエコシステムの基盤です。
つまり、リクエストやレスポンスなど、ASGIの特定の詳細を抽象化するために使用できる高度なコンポーネントのツールキットを提供します。スターレットのハローワールドをご覧ください。
Starletteには、実際のWebフレームワークルーティング、ミドルウェアなどで期待されるすべての機能があります。ASGIの真の魅力を示す簡単な例を示します。引き続き見てください...
「カメすべてダウンダウン」
ASGIの興味深く完全に生態学的に変化するコンセプトは、「タートルズオールダウンダウン」です。これは、Djangoを移行した人によって作成され、元々はDjangoの非同期トランスフォーマーであるAndrew Godwinによって作成されました(おそらく?)。
しかし、それはどういう意味ですか?
ASGIは抽象的な概念であるため、特定のコンテキストでいつでもデータを送受信できます。この考え方により、ASGIは、サーバーとアプリケーションの間だけでなく、スタック内でもデータを交換するために使用できます。どこでもデータを交換。
たとえば、Starlette Responseオブジェクト自体はASGIアプリケーションです。実際、前のStarletteサンプルアプリケーションを次のように簡略化できます。
面白かったですか?
しかし、待ってください。まだまだあります。
より深い意味での「亀」は、さまざまなアプリケーション、ミドルウェア、ライブラリ、その他のプロジェクトを構築し、それらがすべてASGIアプリケーションプログラムインターフェイスを実装している限り、相互運用できることを保証します。
(さらに、Bocadilloのビルドに関する私の自身の経験に基づき、通常(おそらく常に)ASGIインターフェースを使用すると、コードがより簡潔になります。)
たとえば、ASGIミドルウェア(つまり、別のアプリケーションをラップするアプリケーション)を構築して、リクエストがいつ配信されたかを示すことができます。
それを使用するには、それをアプリにラップする必要があります...
...それは魔法のように動作します。
驚いたことに、TimingMiddlewareはあらゆるASGIアプリケーションをラップできます。内部アプリケーションのパッケージ化も非常に簡単で、ASGIと互換性がある限り、どのようなプロジェクトでも、成熟した既存のプロジェクト(数百のAPIとWebSocketエンドポイント)に使用できます。
(本番環境に適したタイミングミドルウェアとして、timing-asgiがあります。)
なぜ気にする必要がありますか?
相互運用性は重要なセールスポイントだと思いますが、ASGIベースのコンポーネントを使用してPython Webアプリケーションを構築することには、他にも多くの利点があります。
- 速度:ASGIアプリケーションとサーバーの非同期の性質により、それらは非常に高速になります(少なくともPythonでは)-60k〜70k req / sについて話しています(FlaskとDjangoは同様の状況で10-20kにしか到達できないと考えています) )。
- 機能:ASGIサーバーとフレームワークを使用すると、既存の同時機能(WebSocket、サーバー送信イベント、HTTP / 2)にアクセスできます。これらの機能は、sync / WSGIを使用して実装することはできません。
- 安定性:ASGIは約3年間仕様として存在しており、バージョン3.0は一般に非常に安定していると考えられています。したがって、エコシステムの基本的な部分は安定しています。
ライブラリとツールに関しては、ここで止めるとは言えないと思います。ただし、非常に活発なコミュニティのため、ASGIエコシステムが従来の同期/ WSGIエコシステムと機能的なバランスを実現できることを強く望んでいます。
ASGIと互換性のあるコンポーネントはどこにありますか?
実際、ますます多くの人々がASGIを中心に構築されたプロジェクトを構築および改善しています。サーバーやWebフレームワークだけでなく、ミドルウェアやDatasetteなどの製品指向のアプリケーションも含まれます。
私が最も賞賛している非Webフレームワークコンポーネントには、次のものがあります。
- Mangum:AWS LambdaをサポートするASGI
- datasette-auth-github:GitHub認証用のASGIアプリケーション
- tartiflette-starlette(この記事は私が書いたものです!):非同期のGraphQLエンジンであるTartifletteをサポートするASGI。
生態系が繁栄しているのを見るのは気持ちがいいですが、私は個人的にすべての進歩を追跡することは困難でした。
この記事の冒頭で書いたように、まさにこの理由でawesome-asgiを作成しました。ASGIエコシステムで起こっているすべてのエキサイティングなことを皆が理解するのに役立つことを願っています。(数日でほぼ100スターに達したことを考えると、ASGIリソースを見つけて共有することが本当に必要だと思います。)
まとめ
小さな機能のように見えますが、ASGIはPython Web開発の新時代の基礎を築いたと思います。
ASGIについて詳しく知りたい場合は、awesome-asgiにリストされているさまざまなコンテンツ(記事および講義)を参照してください。参加したい場合は、以下のプロジェクトを参照してください。
- uvicorn:ASGIサーバー。
- Starlette:ASGIフレームワーク。
- TypeSystem:データの検証とフォームのレンダリング
- データベース:非同期データベースライブラリ。
- orm:非同期ORM。
- HTTPX:ASGIアプリケーションの呼び出しをサポートする非同期HTTPクライアント(テストクライアントとして使用)。
これらのプロジェクトは、Encode(主にTom Christie)によって構築および保守されています。Encodeメンテナンスチームの設立についての公開討論があるので、オープンソース基盤の進捗を促進する機会を探している場合は、こちらをご覧ください。
ASGIの旅をお楽しみください。