DX関連ニュースや事例、ソリューションのご案内。

PythonのWebフレームワーク5種

ウェブサイトまたはサービスのためのバックエンドを構築してみると、最初はすごい目に見えないこともすぐには決してそうではないという事実を知ることになる。「単純な」サイトも複雑な糸巻きのように見えます。ユーザー管理、データ、デザイン、テンプレートの提出、セキュリティなどがすべてを手動で実装するのは退屈で難しい作業である。

特に大規模なWebプロジェクトの場合、あらゆる要素を内蔵したフレームワークに転向するのが最善である。しっかりとしたWebアプリケーションなどを構築するために必要なすべてのものが成る、Python用のWebフレームワーク5種について見てみる。

CubicWeb


キュービックウェブは「再利用およびオブジェクト指向の設計に有利な意味(semantic)Webアプリケーション」と呼ばれる。リックグレたが、2011年にインフォワールドでこれをレビューしたとき言ったように、これは「キューブ」と呼ばれる再利用可能なコードブロックとアップストラクション(abstractions)の使用を強調して非常に興味深いシステムである。実際には、キュービックウェブ開発者によっても抽象的であるか、特異ことができ、開発のスピードと機能が他のフレームワークよりも遅れた。

キューブは、スキーマ(Schema、データモデル)、実体(Entity、プログラミングロジック)、ビュー(View)が特徴であるソフトウェアの構成要素である。それぞれのタスクを実行する複数のキューブを組み合わせることにより、自分と他人のコードを再利用して、ソフトウェア・アプリケーションを構成することができる。

キュービックウェブは、すべてのWebアプリが使用する基本的なスキャフォールディング、データ接続とストレージのための「ストレージ」、基本的なHTTPリクエスト/レスポンスのCRUD操作のための「ウェブエンジン」、モデリングデータのためのスキーマを提供する。このすべてが、Pythonのクラス定義に記載されている。

キュービックウェブインスタンスを設定して管理するには、ジャンゴに使用するのと同じコマンドラインツールを使用する。内蔵されたテンプルレーティング(Tamplating)システムを介してHTML出力をプログラム的に生成することができる。また、ブートストラップ(Bootstrap)HTMLフレームワークなどの、Web UIのためのツールを提供するキューブも使用することができる。

キュービックウェブが、Python 3(バージョン3.23以降)をサポートしますが、Python 3のネイティブ非同期機能は、使用していないように見える。非同期を含める迂回本は「cubicweb.pyramid」モジュールを使用して、ピラミッドのフレームワークをWebサーバーとして使用して、非同期構成を使用するピラミッドのポキン(Forking)バージョンを利用するものである。また、「cubicweb-worke r」キューブを介して作業を非同期で実行することも可能である。しかし、現時点では、より簡単な方法がないと思われる。

キュービックウェブアプリで永続的なデータを呼び出したり、操作するには、SQLのような構文を使用する。しかし、W3CのSparQLのパターンに従うRQL(Relation Query Language)を使用する。これに対するキュービックウェブの正当化根拠も抽象化である。RQLは、さまざまなデータソースを関連付けるために分離されたパスを提供する。

キュービックウェブは依存性が多いのでpip installを使用して、すべて読み込むことが最も良い。また、ローカル環境で一定量の手動調整を行う必要があります。pip installを実行したり、フレームワークのコードを他のプロジェクトのサブフォルダに入れるだけの他のフレームワークとは別の部分である。またはドココンテナを使用して、すべてのことを実行することができる。

キュービック網は、長い文書を「Book」と呼ぶ。北の著者らは、キュービックウェブの異例のアプローチを説明し、いくつかの基本的なアプリケーションを構築する方法を示していAPIリファレンスを含んでいます全体的にそれぞれの具体的な説明を提供する。

キュービックウェブはヌリギンまだ開発が進んでいる。キュービックウェブ4.0の計画は、2012年から検討されたが登場時点ではまだ提示されていなかった。

Django

Djangoは、数年の間にバージョン1.x台にとどまっていた。2017年末ジャンゴ2.0が公開されるPythonの2との互換性を放棄して、Python 3.4以降と互換性された。2019年12月に公開されたジャンゴ3.0は、Python 3.6以上を要求して、PythonのWebアプリケーションのための新しい非同期ASGI標準のサポートを追加しました。

ジャンゴの魅力の核心は配置速度である。ジャンゴは、一般的なWebアプリケーション開発のために必要な多くのものが含まれているため、迅速に動くことができる。ルーティング(Routing)、URL、分析、ORM(object-relational mapper)を含むデータベースの接続、書式検証、攻撃保護、テンプルレーティングがすべて内蔵されている。

普遍的なWebアプリケーションのシナリオに必要なコンポーネントをほとんど見つけることができる。たとえば、ユーザー管理は、ほとんどのウェブサイトでサポートするため、Djangoはこれ標準要素として提供する。ユーザーアカウント、セッション、パスワード、ログイン/ログアウト、管理者権限などを追跡するための独自のシステムを構築する代わりに、Djangoは、このような機能をネイティブで提供する。これらをそのまま使用したり、拡張して警戒所なの努力でユースケースを合わせることができる。

Djangoは、Webアプリケーションを攻撃から保護するのに役立つ十分にそろって、安全なデフォルト値があります。HTMLやJavaScriptを含む文字列などの変数をページテンプレートに挿入すると、変数のインスタンスを明確に安全であると指定しない限り内容がそのまま表示されない。この自体を介して多くの普遍的なクロスサイトスクリプトの作成に問題が消える。書式の検証が必要な場合、単純なCSRF保護号から詳細なエラーフィードバックを提供する、完全なフィールドごとの検証メカニズムまで、すべてを使用することができる。

機能が豊富で、広範囲ても強力な文書が伴わなければ意味がない。ジャンゴ文書は、このフレームワークのすべての面で詳しく扱う。Pythonの3や他の言語を使用した操作は、セキュリティの適用、普遍的なWebアプリケーションコンポーネント(セッションやページネーション)、サイトマップの作成など、あらゆるもの大事にする。各アプリケーション層(モデル、ビュー、テンプレート)のAPIも詳しく説明されている。

しかし、能力に応じて複雑にも大きくなる。ジャンゴアプリケーションは重く可動部分が多いことで定評がある。簡単なジャンゴアプリも動作のためにかなりの量の構成が必要である。一連の単純なREST終点を設定するほか、他のものをしたい場合は、Djangoは明らか過ぎる。

Djangoは奇妙な点もある。たとえば、ページのテンプレートは、コールブル(Callable)を使用することができない。一例として、テンプレートで{{user.name}}を構成要素として渡すことができますが、{{user.get_name()}}は不可能である。ジャンゴテンプレートが不注意で自分の墓を把持ないようにする方法のいずれかであるが、このような制約に備えなければ競合が発生することがあります。バイパス本がありますが、パフォーマンスに打撃を与える傾向がある。

バージョン3.0では、Djangoは非同期ビューのサポートを追加しました。残念ながらORMのようにジャンゴスタックの他の部分ではまだ非同期をサポートしていない。しかし、ASGIを介してDjangoを配置して、非同期ビューを正しく活用することができる。

Web2py


ルビー(Ruby)プログラミングの世界では、ルビーオンレイルジュ(Ruby on Rails)が実質的なフレームワークである。ドゥポル大学コンピュータ工学教授マッシモ・ディ・ピエロはレイルジュからインスピレーションを得て、Pythonで同じようなレベルで簡単に設定して使用することができるWebフレームワークを構築した。その結果、このWeb2pyだ。

Web2pyの最大の魅力は、内蔵された開発環境です。Web2pyインスタンスを設定すると、そのアプリのコンポーネントを構成することができるオンラインのPythonアプリケーションエディタのWebインターフェイスが提供される。つまり、PythonのモジュールやHTMLテンプレートを使用して説明されたモデル、ビュー、コントローラを生成することができる。Web2pyは、基本的にいくつかの例アプリを提供する。これらを分析し、メカニズムを把握したり開始テンプレートとして活用して、自分だけのアプリを開発することができる。

開発者は、一般的にウェプツパイのソースコードをダウンロードし、これを基に構築して配布する。しかし、WindowsまたはMacのOSを使用して技術的な知識が不足しているユーザーのためにウェプツパイの開発者は、基本的に単独型サーバーであるバージョンを提供する。このようなバージョンをダウンロードして解凍し、実行すると、ウェプツパイが内蔵されたローカルWebサーバーを持つようになる。これにより、最初にウェプツパイアプリを簡単に構築し、必要に応じて他の場所に配置することができる。

Web2pyのインターフェイスは、ブートストラップ4で構築されたため、見た目にも良く、簡単にナビゲートすることができる。ブラウザベースのエディタがフル機能のIDEを置き換えることはできませんが、行番号とPython構文の強調表示(自動インデントを含む)などの便利なサポート機能を備えた。また、Pythonのシェル(Shell)の簡単なWebインターフェイスが含まれており、コマンドラインからWeb2pyと相互作用することができる。専門家たちには便利な機能である。

Web2pyで使用されるデータの抽象化システムは、ジャンゴのORMとここからインスピレーションを得た、他のORM(Peeweeなど)とは少し異なる動作をする。このシステムは、Pythonのクラスを使用してモデルを定義しますがウェプツパイはdefine_table同じコンストラクタ機能を使用してモデルをインスタンス化する。他の方法に慣れた場合にのみ、相違点が明らかにされる可能性があり、初心者が戸惑うことはないだろう。Web2pyは、現存するほとんどすべての主要なデータベースと通信するためのデータプロバイダに接続するために問題がある可能性がない。

Web2pyで本当に便利なデータベース関連の機能は、モデルの図を作成して、モデルが互いにどのように連携されるか視覚化することができる機能である。しかし、この機能を有効にするには、PyGraphvizライブラリをインストールする必要がある。

Web2pyは、統合されたjQueryとAJAXのサポートにより、国際化機能を、様々なキャッシュ(Cache)処理方法、アクセス管理、承認、フロントエンド(Front End)の効果(書式の日付の選択など)など他の専門家レベルのコンポーネントを提供していする。外部と内部のミドルウェア(Middleware)の接続も含まれていますが、ミドルウェアを使用して重要なウェプツパイ機能を代替することはできない。しかし、Web2pyは、明示的に、Pythonの非同期機能を使用する方法がなく、長期的な作業を処理するためのスケジューラ(Scheduler)があることはある。 

Web2pyの文書も当然「book」と呼ばれる。まず、Web2pyは、Python、これらに使用される配置環境の膨大な量の資料を扱う。第二に、アクセスが高い叙述式で作成されている。第三に、普遍的なアプリケーションの構築のシナリオについて深く扱う。たとえば、章一つがjQueryを使用してAJAXアプリケーションを構築する方法を扱う。

Weppy

ウェピ(Weppy)フラスコ(Flask)の簡潔とジャンゴの完全性との間に存在のように感じられる。ウェピアプリの開発は、フラッシュだけ簡単ですウェピには、データ層と認証などジャンゴの多くの機能もある。だからウェピは非常に単純なものから、かなり洗練されたものまで、様々なアプリに適している。

最初はウェピコードがフラスココードやボトルコードのように単純に見える。説明がなくても、基本的な単一パスのWebサイトを構成して実行することができる。パスは、機能デコレーター(Decorator、簡単な方法)やプログラム的に説明することができ、その文法はFlask / Bottleと類似している。テンプルレーティングも文法の些細な違いを除いては、ほぼ同じである。

ウェピは、このような小規模なフレームワークとは異なり、プラグインやアドオンにのみ統合する機能が含まれています。例えば、フラスコやボトルは、内蔵されたORMまたはデータ管理システムがない。ウェピにORMが含まれている。ただし、多くの人気のあるSQLAlchemyではなく、pyDALプロジェクトに基づいている。ウェピも、スキーマの移行をサポートする。DjangoはこれORMサポートする(Djangoの移行システムは、はるかに自動化されていることもある)。ウェピは、拡張機能のメカニズムがありますが、正式に承認されたアドオンがフラスコの拡張機能カタログよりもはるかに少ない。

ウェピのように軽いフレームワークは、RESTful API構築に使用されている場合が多く、ウェピには、これのために利便性の機能が搭載されている。パスに@serviceデコレーターを入れると返されるデータは、自動的に書式化されている(JSONまたはXML)。

ウェピは、より大きなフレームワークと似て見えますが、小規模で実装されている他の機能が含まれています。その例として、データ検証メカニズム、書式処理、応答キャッシュ処理、ユーザーの検証などがある。すべての場合にウェピは「適切な」アプローチをとる。提供される機能は、Djangoと他の重いフレームワークだけ完全ませんが、開発者は、これらを活用するために多くの努力を払う必要がなく、常に事後に拡張することができる。

ウェピに含まれている別の重いフレームワークの機能は、国際化のサポートである。テンプレートの文字列は、アプリケーションと一緒に提供されているロケール(Locale)ファイル(単純なPythonの辞書)に基づいて解釈することができる。言語を選択もブラウザ要求(つまり、Accept-Language HTTPヘッダ)を分析したり、解釈を特定のパスに連動させて設定することができる。

ウェピのドキュメントは、フレームワーク自体のような傾向である。すっきり可読性が良く、人間が消費するように作成されました。一般的な「ハローワールド(Hello World)」の例のほか、スタートアッププロジェクトにマイクロブログシステムを構築することができるウォークスルー(Walkthrough)チュートリアルが含まれている。

ウェピの長期計画には、非同期とソケット(Socket)が低レベルの第1のクラスの実体に含まれている。ウェピの開発者は、このような機能をバージョン2.0で導入した後、将来のすべてのウェピバージョンでは、Pythonの3.7以上を要求する計画だ。

Zope


Zopeは、シンプルなRESTful API(BottleまたはFlaskによる)や相互作用性がある基本的なウェブサイト(Djangoスタイル)のためのものではない。代わりにゾフは、Java(Java)のためのサーバー製品と同様の完全な機能を備えたエンタープライズアプリケーションサーバスタック(Stack)である。ここでは、このフレームワークを「コンポーネントの開発者、インテグレータ、Webデザイナーに最も有用である」と記載されている。第三者製品Plone CMSはゾフを基質として使用し、Zopeの継続的な開発のための主要な同人として作用する。

Zopeは、Webからの要求を受け、要求のパラメータを内部オブジェクトデータベース(ZODB)と比較して、要求のGETまたはPOSTパラメータを使用して、そのオブジェクトを実行させる。オブジェクトの後ろに来ることは何でも、クライアントに返される。ゾフはこのデータベースオブジェクトシステムを使用して、微妙なオブジェクト権限の割り当て、オブジェクトの継承階層を提供し、データベースオブジェクトのトランザクションおよびロールバック処理などの操作を簡素化する。

Zopeの規模と複雑さのためのインストールが容易ではない。ソースをプロジェクトサブフォルダに解凍するとされていることではない。Zopeは、構成ファイルに基づいてゾフソースディストリビューションのコピーをインストールするzc.buildoutという特殊なインストールツールを使用する。Pythonのパッケージ管理システムを使用している人であれば停滞するだろう。

Zopeを実行させ、サーバーに接続すると、Web UIが提供され、そこからZODBオブジェクトを作成および編集することができる。オブジェクトは、コンテンツ、ロジック、プレゼンテーションの3つの基本的な役割の一つを担当し、ドキュメント(MIMEタイプを持つすべてのファイル)は、Pythonスクリプト、HTMLテンプレートで構成されることができる。

テンプレートは、新しい、より柔軟なZPT(Zope Page Template)システムが長くなって、基本的なDTMLマークアップシステムを使用して処理する。ZPTは、HTMLタグ内の属性を使用してデータを配置する場所を示すために、一般的なHTMLツールを使用して、テンプレートをより簡単にデザインすることができる。しかし、ZPT文法は慣れるのに時間が必要である。

Zopeが利点であると主張することの一つは、オブジェクト指向方法論管関連している。システムの中でのすべての動作が動作しているオブジェクトの種類に関係なく、トランザクションによってカプセル化されるという点である。したがってゾフのデータベースに保存されているファイルを削除するか、コードの一部に破壊的な変更を加える場合は、実行されたアクションをロールバックするだけです。

Zopeのアプローチの欠点は、このようなコードベースに込められ(Git)のような現代的なソース管理ツールを使用するのが難しいということであり、これにより、データがZopeのカスタマイズデータベースツールによって影響を及ぼされる。MySQLなどの外部データベースをゾフアプリケーションに接続できますがZODBを交換するのではなく、アプリケーションのデータをホストしていることに制限される。

少なくとも現在の形でZopeもう一つの欠点は、Pythonの非同期構文を直接サポートしていないという点である。しかし、zc.asyncパッケージを使用して機器の間で作業を分配しZODBインスタンス内で同期させることができる。