8つの素晴らしい小さなPythonWebフレームワーク

Pythonの利便性と汎用性は、ITライフのほぼすべての段階でソフトウェアを構築するために使用されていることを意味します。主要なニッチの1つはWebサービスです。このサービスでは、Pythonの開発速度と柔軟なメタファーにより、Webサイトを簡単に立ち上げて実行できます。

そして、ご想像のとおり、Pythonは、小規模から大規模まで、Webフレームワークに多くの選択肢と自由度を提供します。結局のところ、すべてのWebプロジェクトがエンタープライズ規模である必要はありません。ほとんどは、仕事を成し遂げるのに十分な大きさであり、それ以上の大きさであってはなりません。この記事では、シンプルさ、軽量な配信、および厳密な焦点を強調する、最もよく知られている8つのPythonフレームワークについて調査します。

ボトル

ボトルは、他の「マイクロフレームワーク」よりもさらにコンパクトで簡潔であるため、一種のミニフラスコと見なすことができます。フットプリントが最小であるため、Bottleは他のプロジェクトに含める場合や、RESTAPIなどの小さなプロジェクトを迅速に提供する場合に最適です。(フラスコについては以下で説明します。) 

Bottleのコードベース全体が1つのファイルに収まり、外部依存関係はまったくありません。それでも、Bottleには、外部の支援に頼ることなく、一般的な種類のWebアプリを構築するのに十分な機能が備わっています。

URLを関数にマップするBottleのルーティングシステムは、Flaskとほぼ同じ構文です。また、ハードワイヤードのパスのセットに限定されません。それらを動的に作成できます。リクエストとレスポンスのデータ、Cookie、クエリ変数、POSTアクションからのフォームデータ、HTTPヘッダー、ファイルのアップロードはすべて、Bottle内のオブジェクトを介してアクセスおよび操作できます。

各機能は細部にまで注意を払って実装されています。たとえば、ファイルのアップロードでは、命名規則がターゲットファイルシステムと衝突する場合(Windowsでの名前のスラッシュなど)、ファイルの名前を変更する必要はありません。ボトルはあなたのためにそれをすることができます。

ボトルには、独自のシンプルなHTMLテンプレートエンジンが含まれています。繰り返しになりますが、最小限ではありますが、テンプレートエンジンにはすべての基本事項があります。テンプレートに含まれる変数は、デフォルトで安全なHTMLでレンダリングされます。どの変数を文字通り再現しても安全かを示す必要があります。BottleのテンプレートエンジンをJinja2などの別のテンプレートエンジンに交換したい場合は、Bottleを使用すると大騒ぎせずに交換できます。私はBottleにバンドルされているシンプルなテンプレートシステムを好みます。高速で、構文が気取らず、コードとテンプレートテキストを過度の困難なしに混在させることができます。

ボトルは複数のサーバーバックエンドもサポートします。迅速なテストのために独自のミニサーバーが組み込まれていますが、一般的なWSGI、さまざまなWSGI互換のHTTPサーバー、および必要に応じてプレーンな古いCGIもサポートします。

ボトルは他のフレームワークほど多くのドキュメントを必要としませんが、ドキュメントは決して簡潔ではありません。重要なものはすべて、1つの(長いとはいえ)Webページに収まります。それ以外にも、各APIの完全なドキュメント、さまざまなインフラストラクチャにデプロイするための例、組み込みのテンプレート言語の説明、および多数の一般的なレシピがあります。

Flaskと同様に、Bottleの機能を手動またはプラグインを介して拡張できます。ボトルプラグインはFlaskほど多くはありませんが、さまざまなデータベースレイヤーとの統合や基本的なユーザー認証など、便利な要素があります。非同期サポートの場合、Bottleはaiohttp / uvloopなど、非同期で実行される既存のサーバーアダプターの1つを使用できますが、async/awaitネイティブではサポートされていません。

ボトルのミニマリズムの1つの結果は、いくつかのアイテムが単にそこにないということです。CSRF(クロスサイトリクエストフォージェリ)保護などの機能を含むフォーム検証は含まれていません。高度なユーザーインタラクションをサポートするWebアプリケーションを構築する場合は、そのサポートを自分で追加する必要があります。

ボトルのもう1つの問題は、開発が停滞していることです。最後のポイントリリースである0.12は2013年に到着しました。とはいえ、Bottleは引き続き維持され、その開発リリースは引き続き本番環境で使用できます。開発者は、Pythonのレガシーエディションのサポートを提供する新しいバージョンを提供する予定です。

CherryPy

CherryPyは、ほぼ20年間、何らかの形で存在していますが、最初からそれを際立たせたミニマリズムとエレガンスを失っていません。

CherryPyの背後にある目標は、Webページを提供するために必要なほんの少しだけを含むことを除いて、可能な限り「Webフレームワーク」のようではなく、他の種類のPythonアプリケーションのように感じることです。HuluやNetflixのようなサイトは、フレームワークが非常に目立たない基盤を提供するため、本番環境でCherryPyを使用しています。CherryPyは、内部でプールされたスレッドを使用するため、マルチスレッドサーバーアダプターをサポートするのに適しています。

CherryPyを使用すると、Webアプリケーションをコアロジックから切り離すことができます。アプリケーションの関数をCherryPyが提供するURLまたはルートにマップするには、オブジェクトの名前空間が提供するURLに直接マップするクラスを作成します。たとえば、Webサイトのルートは、「index」という名前の関数によって提供されます。これらの関数に渡されるパラメーターは、GETまたはPOSTメソッドによって提供される変数を処理するために使用されます。

CherryPyに含まれるビットは、低レベルのビルディングブロックとして機能することを目的としています。セッション識別子とCookie処理は含まれていますが、HTMLテンプレートは含まれていません。ボトルのように、CherryPyは静的ファイル提供のためにディスク上のディレクトリにルートをマップする方法を提供します。

CherryPyは、機能をネイティブに提供するのではなく、既存のサードパーティライブラリに依存して機能をサポートすることがよくあります。たとえば、WebSocketアプリケーションは、CherryPyで直接サポートされていませんが、ws4pyライブラリを介してサポートされています。

CherryPyのドキュメントには、プログラムのさまざまな側面の便利なチュートリアルウォークスルーが含まれています。他のフレームワークチュートリアルとは異なり、完全なエンドツーエンドのアプリケーションを紹介することはできませんが、それでも便利です。ドキュメントには、仮想ホストでのデプロイ、ApacheとNginxを介したリバースプロキシ、およびその他の多くのシナリオに関する便利なメモが付属しています。

ファルコン

RESTベースのAPIだけを構築しているのであれば、Falconはあなたのためだけに作られました。無駄のない高速で、標準ライブラリ以外の依存関係はほとんどありません。Falconは、RESTAPIに必要なすべてのものを提供します。 2019年にリリースされたFalcon2.0は、Python 2.xのサポートを廃止し、少なくともPython3.5を必要とします。

Falconが「軽くて細い」ラベルを獲得する理由の大部分は、フレームワークのコード行数とはほとんど関係がありません。これは、Falconがアプリケーションに独自の構造をほとんど課していないためです。 Falconアプリケーションが行う必要があるのは、どの関数がどのAPIエンドポイントにマップされるかを示すことだけです。エンドポイントからJSONを返すには、ルートを設定し、json.dumpsPythonの標準ライブラリの関数を介してデータを返すだけです。非同期のサポートはまだFalconに導入されていませんが、Falcon3.0でそれを実現するための作業が進行中です。

Falconはまた、すぐに使用できるデフォルトを採用しているため、セットアップに少し手を加える必要があります。たとえば、明示的に宣言されていないルートでは、デフォルトで404が発生します。クライアントにエラーを返したい場合は、フレームワークにバンドルされている多数のストック例外(などHTTPBadRequest)の1つを発生させるか、一般falcon.HTTPError的な例外を使用できます。ルートの前処理または後処理が必要な場合、Falconはそれらにもフックを提供します。

FalconはAPIに重点を置いているため、従来のHTMLユーザーインターフェイスを使用してWebアプリを構築する方法はほとんどありません。たとえば、フォーム処理機能やCSRF保護ツールについてはあまり期待しないでください。とは言うものの、Falconはその機能を拡張するためのエレガントなオプションを提供するため、より洗練されたアイテムを構築できます。上記のフックメカニズムとは別に、FalconのすべてのAPIをラップするために使用できるミドルウェアを作成するためのインターフェースがあります。

Falconのドキュメントは他のフレームワークに比べて細いですが、それはカバーするものが少ないからです。ユーザーガイドには、すべての主要な機能の正式なステップバイステップのウォークスルーと、注釈付きまたは注釈なしのサンプルコードを表示できるクイックスタートセクションが含まれています。

FastAPI

FastAPIの名前は、FastAPIの機能をうまくまとめたものです。APIエンドポイントをすばやく作成するように構築されており、実行も高速です。

FastAPIは、高速ネットワークコアにStarletteプロジェクトを利用しますが、FastAPIを使用するためにStarletteの内部について知る必要はありません。FlaskまたはBottleアプリとほぼ同じ方法でエンドポイントを定義し、デコレータを使用してどの関数がどのルートを処理するかを示し、自動的にJSONに変換される辞書を返します。

返される方法を簡単に上書きできます。たとえば、一部のエンドポイントからHTML / XMLを返したい場合は、カスタムResponseオブジェクトを返すだけでそれを行うことができます。カスタムミドルウェアを追加する場合は、ASGI標準に準拠したものなら何でも入力できます。 

FastAPIは、Pythonの型ヒントを利用して、ルートが受け入れるデータの種類に制約を与えます。たとえば、タイプがのルートがある場合Optional[int]、FastAPIは整数以外のすべての送信を拒否します。エンドポイントにデータ検証コードを追加する必要はありません。型ヒントを使用して、FastAPIに作業を任せることができます。

当然、いくつかのことが省略されています。たとえば、ネイティブHTMLテンプレートエンジンはありませんが、そのギャップを埋めるためのサードパーティソリューションが不足することはありません。データベース接続と同じですが、ドキュメントには、FastAPIの非同期動作を操作するために特定のORM(Peeweeなど)を誘導する方法の詳細が含まれています。

フラスコ

Python Webフレームワークに関する多くの議論は、Flaskから始まりますが、それには正当な理由があります。Flaskは、十分に確立され、よく理解されているフレームワークであり、使いやすく、非常に安定しています。軽量のWebプロジェクトまたは基本的なRESTAPIにFlaskを使用して間違いを犯すことはほぼ不可能ですが、より大きなものを構築しようとすると、手間がかかります。

Flaskの中心的な魅力は、参入障壁が低いことです。基本的な「HelloWorld」アプリは、10行未満のPythonでセットアップできます。Flaskには、テキストのレンダリングを簡単にするために広く使用されているHTMLテンプレートシステムJinja2が含まれていますが、Jinja2は、他の任意の数のテンプレートエンジン(Mustacheなど)と交換することも、独自にロールすることもできます。

単純さの名の下に、FlaskはデータレイヤーやORMなどの優れた機能を省略し、フォーム検証などの機能を提供していません。ただし、Flaskは、キャッシュ、フォームの処理と検証、データベース接続など、多くの一般的なユースケースをカバーする数十の拡張機能を介して拡張できます。このデフォルトの無駄のない設計により、最小限の機能でFlaskアプリケーションのエンジニアリングを開始し、必要なときに必要な部分だけをレイヤー化することができます。

Flaskのドキュメントは親切で読みやすいです。クイックスタートドキュメントは、単純なFlaskアプリケーションのデフォルトの選択の重要性を説明しながら、開始するのに優れた仕事をします。APIドキュメントには良い例がたくさんあります。また、Flashスニペットのコレクションも優れています。これは、オブジェクトが存在する場合はオブジェクトを返す方法、存在しない場合は404エラーなど、特定のタスクを実行する方法の簡単な例です。

Flaskは2018年にマイルストーン1.0のリリースを達成し、Python2.6とPython3.3がサポートされている最小バージョンであり、その動作の多くがついに石になりました。FlaskはPythonの非同期構文を明示的にサポートしていませんが、Quartと呼ばれるFlaskのAPI互換のバリエーションは、その要求を満たすためにスピンオフされました。

ピラミッド

小型軽量のPyramidは、既存のPythonコードをREST APIとして公開したり、開発者が手間のかかる作業のほとんどを行うWebプロジェクトのコアを提供したりするなどのタスクに最適です。

「ピラミッドを使用すると、生産性がすぐに向上し、一緒に成長します」とドキュメントは述べています。「アプリケーションが小さいときは邪魔にならず、アプリケーションが大きくなっても邪魔になりません。」

Pyramidのミニマリズムを説明する良い方法は、「ポリシーなし」です。これは、Pyramidが他のWebフレームワークに対してどのように形成されるかを説明するドキュメントのセクションで使用される用語です。基本的に、「ポリシーなし」とは、どのデータベースまたはどのテンプレート言語を使用するかがPyramidの関心事ではないことを意味します。

基本的なPyramidアプリケーションを構築するために必要な作業はほとんどありません。BottleやFlaskと同様に、Pyramidアプリケーションは、フレームワーク自体のファイルとは別に、単一のPythonファイルで構成できます。単純な1ルートAPIは、12行程度のコードしか必要としません。そのほとんどは、定型的なfrom … importステートメントとWSGIサーバーのセットアップです。

デフォルトでは、PyramidにはWebアプリで一般的ないくつかのアイテムが含まれていますが、それらは本格的なソリューションとしてではなく、つなぎ合わせるためのコンポーネントとして提供されています。たとえば、ユーザーセッションのサポートには、CSRF保護も含まれています。ただし、ログインやアカウント管理などのユーザーアカウントのサポートは、取引の一部ではありません。自分でロールするか、プラグインを介して追加する必要があります。フォーム処理とデータベース接続についても同じことが言えます。

Pyramidは、以前のPyramidプロジェクトからテンプレートを作成して、以前の作業を再利用する方法も提供します。「足場」と呼ばれるこれらのテンプレートは、単純なルーティングといくつかのスターターHTML / CSSテンプレートを使用してピラミッドアプリを生成します。バンドルされているスキャフォールドには、サンプルのスタータープロジェクトと、人気のあるPythonライブラリSQLAlchemyを介してデータベースに接続するプロジェクトが含まれています。