社畜エンジニアがおすすめする2022年トレンドのPythonフレームワークまとめ
概要
Python を使用する開発者は増え続けており、より多くのアプリケーションを開発できるように Python フレームワーク を使うことは必然です。
Python は、機械学習や大規模な計算、スクレイピングをするのに適しており、それらを一から構築するのは大変の労力を消費し、それを解消するために様々なフレームワークが作られています。
それに伴い、 どのフレームワーク使用するか選定するのに、開発者は非常に時間を浪費することが確実です。なぜならば各種フレームワークには、独自のシステムや利点・思想がありそれらはメリット・デメリットが様々です。
ここでは 2022 年に Python を使用する際に、選定対象となるフレームワークを紹介します。
おすすめ Python フレームワーク一覧
name | PyPI | Stars | Recommended |
---|---|---|---|
Django | https://pypi.org/project/Django/ | 58K | 〇 |
CubicWeb | https://pypi.org/project/cubicweb/ | ○ | |
Giotto | https://pypi.org/project/giotto/ | 54 | |
AIOHTTP | https://pypi.org/project/aiohttp/ | 11K | ○ |
Growler | https://pypi.org/project/growler/ | 0.6K | |
Sanic | https://pypi.org/project/sanic/ | 1.5K | |
tornado | https://pypi.org/project/tornado/ | ||
CherryPy | https://pypi.org/project/CherryPy/ | 1K | ○ |
Flask | https://pypi.org/project/Flask/ | 5.5K | ○ |
Django
Django はフルスタックの Python フレームワーク です。 Python アプリケーションを開発したい場合、多くの技術者は Django を選定対象とします。
フルスタックフレームワークとは Web アプリケーションに必要な機能である、フォームやバリデーション、テンプレートなどを提供しているフレームワークのことを言います。Django もその一つです。
Django はオープンソースであり、非常に多くの組み込み機能が存在し、開発者はその多くを無料で利用できます。
またデータベーステーブルにマッピングすらために ORM を利用しています。
ORM とは『オブジェクト関係マッピング』といい、データーベースの操作をオブジェクトとして直感的に利用でき、これを使えるというのは大きなメリッドです。そして MySQL、Postgres、SQLite などの様々なデータベースをサポートしています。
メリット
- 成熟されたサポート
Django は 2005 年のリリースから長い年月が経っており、既にサポート体制も万全で、ドキュメントに関しても豊富です。
日本人の開発者も多いため、もしあなたのアプリケーションでバグが発生したとしてもすぐに調べることが可能です。 - 認証サポート
Web アプリケーションの認証機能を作るのは非常に大変です。
データベースの認証設定やセッション・クッキー設定、様々な困難があなたを襲います。Django は既に認証機能がバンドルされています。それを使用することで最小の開発工数で済むことは間違いないです。 - ORM のサポート
ORM は『オブジェクト関係マッピング』のことです。
ORM を利用することであなたのデーターベース操作はより直感的になることでしょう。 - Web サーバーのサポート
Django はそれだけで Web サーバーの役割と果たします。
バックエンドとフロントエンド構成をそれぞれ作る必要がありません。 - テンプレートエンジンのサポート
Django にはテンプレートエンジンが存在します。
それを利用することで、サーバのデータを好きなだけフロントに出力できます。 - Sitemap の作成
sitemap は重要なファイルです。Google クローラーに自サイトの更新を伝えなければインデックスされないからです。
Django は Sitemap を作成する機能があります。
デメリット
- 小規模プロジェクトには向かない
Django は非常にバンドルされている機能が多いです。そのためそれを使う技術も逐一覚える必要があり、小規模プロジェクトで扱うには向かないです。
サンプルコード
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
筆者評価
Django フレームワークについては大規模プロジェクトに向いており、非常に効率的です。MVT(Model View Template)と呼ばれるアーキテクチャがコードの保守性を担保してくれるからです。さらには ORM レイヤーを装備しており、複雑なクエリやプロシージャは全て Python で記述することができます。
これらは可読性の向上や開発者が複雑な SQL を理解する必要がなく学習コストが少なく済みます。
さらに Django はドキュメントやチュートリアルが豊富ですので、初心者の方にもおすすめです。
CubicWeb
CubicWeb はフルスタックの Python フレームワーク です。これは Django の代替案となりえます。
Django には負けないほど機能を有しており、作成した機能はコンポーネントと呼ばれる単位で再利用が容易です。
公式サイトで上げている機能が以下の通りです。
- アプリケーションの明示的なデータモデルによって駆動されるエンジン
- W3C の SPARQL に似たRQLという名前のクエリ言語。
- 選択+ビュー半自動 XHTML / XML / JSON /テキスト生成するための機構
- 共通のニーズを満たす再利用可能なコンポーネント(データモデルとビュー)のライブラリ
- Pythonプログラミング言語のパワーと柔軟性
- ストレージバックエンドの SQL データベース、LDAP ディレクトリ、Subversion、Mercurial の信頼性
メリット
- OWL および RDF のサポート
OWL は(Web オントロジー言語)の略でインターネット上に存在するオントロジーを用いてデータ交換を行うためのデータ記述言語のことです。
RDF は(リソース記述フレームワーク)の略で、RDF 形式で格納されたデータの検索と操作が可能なコンピュータ言語である。CubicWeb はこれらをサポートしています。 - 再利用性
CubicWeb は機能をコンポーネント単位で分けることが可能です。それらは再利用が用意な機能として好きなだけ利用できます。 - 複数のデーターベースのサポート
デメリット
- サポート不足
リリースされたから 20 年以上たちますが日本サポートが万全ではなく、日本語のドキュメントが不足しています。
日本人で CubicWeb を使う場合、不利な開発を要求されるでしょう。
サンプルコード
def includeme(config):
# ...
config.include('cubicweb.pyramid')
# ...
筆者評価
追記予定
Giotto
Giotto はフルスタックの Python フレームワーク です。これは Django の代替案となりえます。
Giotto は MVC(Model View Controller)による開発を行える、フルスタック Web フレームワークです。
MVC 開発を行うことで、フロント、バックエンドで開発者の役割を分担することができ効率的に作業を行えます。
メリッド
- MVC 開発パターン
MVC での開発が行えます。MVC 開発に慣れている人ならば、Django 以上の選定対象なりえます。 - 簡潔なコード
フル機能のブログアプリケーションを作成する場合 300 行未満で作成できます。 - 自動 URL ルーティング
作成したコントローラーに基づいてルーティングを自動作成してくれます。 - 組み込みキャッシュのサポート
Redis や Memcache をサポートしています。それらのエンジンをサポートする API が備わっています。
デメリット
- サポート不足
リリースされたから 7 年以上たちますが日本サポートが万全ではなく、日本語のドキュメントが不足しています。
日本人で Giotto を使う場合、不利な開発を要求されるでしょう。
サンプルコード
from giotto.programs import ProgramManifest, GiottoProgram
from giotto.views import jinja_template, BasicView
def multiply(x, y):
x = int(x or 0)
y = int(y or y)
return {'x': x, 'y': y, 'result': x * y}
manifest = ProgramManifest({
'multiply': GiottoProgram(
model=[multiply],
view=BasicView(
html=jinja_template('multiply.html'),
),
),
})
筆者評価
NestJs や Angular のようにコマンドライン上でアプリを作成できるコントローラーモジュールが用意されており、非常に効率的に開発を行えます。
初心者でも、コマンドライン上で瞬時にコントローラーやモデルの作成ができるので、最初の結合部分で悩む必要がないです。
非常におすすめの Python フレームワークです。
AIOHTTP
AIOHTTP は、非同期の **Python フレームワーク** です。
非同期で通信が行えるアプリケーションのは近年需要が高まっています。
AIOHTP はその非同期フレームワークの一つです。
非同期フレームワークとは、多数の同時接続を可能にするフレームワークであり、ユーザーに通信遅延を渡しません。そのため、ユーザーエクスペリエンスを向上させたい場合の最上の選考対象となります。
メリット
- テンプレートエンジンのサポート
AIOHTTP にはテンプレートエンジンが存在します。
それを利用することで、サーバのデータを好きなだけフロントに出力できます。 - 強力な socket サポート
従来の socket 通信は、プログラムコードを書く上でコールバック地獄になりやすいことは周知の事実です。
AIOHTTP は非同期で通信処理をかけるためそのようなことはないです。
可読性の高いコードを好きなだけ書きましょう - ミドルウェアのサポート
ミドルウェアを作成できます。
ミドルウェアを使用すると通信時に前後の処理を決まった処理を実行させることができます。
デメリット
追記予定
サンプルコード
import aiohttp
import asyncio
async def main():
async with aiohttp.ClientSession() as session:
async with session.get('http://python.org') as response:
print("Status:", response.status)
print("Content-type:", response.headers['content-type'])
html = await response.text()
print("Body:", html[:15], "...")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Growler
Growler は、非同期の Python フレームワーク です。
非同期で通信が行えるアプリケーションのは近年需要が高まっています。
Growler はその非同期フレームワークの一つです。
このフレームワークは Express フレームワークからヒント得て開発されており、複雑なアプリケーションを簡単に実装することに長けています。
また、非常に軽量なフレームワークであるといえます。
メリット
- 関節なコードフロー
async による非同期処理、コールバック関数に try/exception ブロックがないため、非常にわかりやすいコードになることが期待できます。 - 多数のオープンソースパッケージの完備
有志によりオープンソースのパッケージが作成されています。
これを利用することで、開発期間を短縮できます。
デメリット
追記予定
サンプルコード
import asyncio
from growler import App
from growler.middleware import (Logger, Static, StringRenderer)
loop = asyncio.get_event_loop()
# Construct our application with name GrowlerServer
app = App('GrowlerServer', loop=loop)
# Add some growler middleware to the application
app.use(Logger())
app.use(Static(path='public'))
app.use(StringRenderer("views/"))
# Add some routes to the application
@app.get('/')
def index(req, res):
res.render("home")
@app.get('/hello')
def hello_world(req, res):
res.send_text("Hello World!!")
# Create the server - this automatically adds it to the asyncio event loop
Server = app.create_server(host='127.0.0.1', port=8000)
# Tell the event loop to run forever - this will listen to the server's
# socket and wake up the growler application upon each connection
loop.run_forever()
Sanic
Sanic は、非同期の Python フレームワーク です。
非同期で通信が行えるアプリケーションのは近年需要が高まっています。
Sanic はその非同期フレームワークの一つです。
Sanic はその名前の通り、高速 HTTP レスポンスを提供するために特別に開発されたシンプルでオープンソースなフレームワークです。
高速な Web アプリケーションを目指している場合 Sanic は選定対象となります。
また Sanic は非同期リクエストハンドラーをサポートしているため、async/await などの非同期関数と互換性があります。そのため HTTP レスポンスが高速だけでなく、ノンブロッキングでリクエストを処理できます。
メリッド
- 高速処理
他の非同期 Python フレームワーク より高速です。 - cookies 機能のバンドル
cookies を操作するための機能がバンドルされています。
新たにインストールする必要がありません。
デメリット
- 日本語ドキュメントの不足
現状で Sonic 開発者が不足しています。
日本語ドキュメントでエラー内容やベストプラクティスを参照するのは難しいでしょう、
サンプルコード
from sanic import Sanic
from sanic.response import json
app = Sanic("My Hello, world app")
@app.route('/')
async def test(request):
return json({'hello': 'world'})
if __name__ == '__main__':
app.run()
Tornado
Tornado は、非同期の Python フレームワーク です。
非同期で通信が行えるアプリケーションのは近年需要が高まっています。
Tornado はその非同期フレームワークの一つです。
Tornado は、Apache の C10k 問題の解決と非ブロッキング処理を提供します。
さらにシンプルで高速です。
そのため Tornado は、多数のユーザーに高パフォーマンスな Web サイトを提供するために最適な選定対象となります。
メリット
- テンプレートエンジンのサポート
Tornado にはテンプレートエンジンが存在します。
それを利用することで、サーバのデータを好きなだけフロントに出力できます。 - 高パフォーマンス
非常に高速です。 - 翻訳のサポート
多言語対応を簡単に実装できます。 - Facebook サポート
開発会社が Facebook に買収されており、現在サポートは Facebook が行っています。良質はサポートを受けられるでしょう。
デメリット
- 日本語ドキュメントの不足
日本語サイトが不足しており、翻訳サイトがありません。
日本語ドキュメントでエラー内容やベストプラクティスを参照するのは難しいでしょう、
サンプルコード
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
CherryPy
もっとも人気のあるオープンソースのオブジェクト指向フレームワーク です。
CherryPy はマイクロフレームワークの最古参です。
マイクロマイクロフレームワークとは、フルスタックフレームワークと違い必要最低限の機能しか提供しない軽量なフレームワークであり、開発者は必要な機能を逐一自らの手で開発していかないといけません。
CherryPy で作成された、Web アプリケーションは Web サーバーが組み込まれたスタンドアロンの Web アプリケーションとして実行されるため、任意の OS で実行され Apache などのサーバーアプリケーションは必要ありません。
メリッド
- 多様なツール
CherryPy はマイクロフレームワークですが、よく使う機能が網羅されています。
認証、セッション、cookies、静的コンテンツなどがすぐに利用できます。 - オブジェクト指向
Python フレームワーク では珍しいオブジェクト指向です。
Java などのプログラミング言語を使用したことがある人にお勧めです。 - 軽量
マイクロフレームワークであるため、非常に軽量です。
サイトスピードが気になる場合、選定対象になりえます。 - 高速で安定
CherryPy は 10 年以上、Web アプリケーションの開発をサポートしています。
その長い月日の中で、高速で安定して Web アプリケーションを提供できることが証明されています。
デメリット
追記予定
サンプルコード
import cherrypy
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello World!"
cherrypy.quickstart(HelloWorld())
Flask
Django について人気のあるフレームワークであるといえます。
Flask は BSD ライセンスの下で利用可能なマイクロフレームワークです。
マイクロフレームワークとは、フルスタックフレームワークと違い必要最低限の機能しか提供しない軽量なフレームワークであり、開発者は必要な機能を逐一自らの手で開発していかないといけません。
Flask はマイクロフレームなので、必要な機能は開発者が用意しなければいけませんが、その開発を手助けする強固な Web アプリケーション基盤を構築できます。
メリット
- 非常に軽量
必要最低限の機能しか存在しないので、非常に軽量です。
開発者は本当に必要な機能だけを利用できます。 - カスタマイズ性
必要な機能しか存在せず、拡張を容易にする基盤がすでに出来上がっています。その基盤を利用することで非常に容易にプラグインの開発などができます。 - 非常に覚えやすい
マイクロフレームワークは必要な機能しか持ちません。
Flask はそのようなフレームワークなので、本当に必要な機能だけをキャッチアップに使うことができます。
デメリット
- フロントエンドに時間を使う必要がある
Flask だけで Web アプリケーションを作成するのは可能ですが、難しいです。
一つのフレームワークで完結させたい場合は、Django を使いましょう。
サンプルコード
# save this as app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, World!"
まとめ
昨今の Python アプリケーション開発でフレームワークを使った開発を必須です。
開発期間を大幅に短時間で作成できるからです。
あなたが技術者ならばこのメリッドを全力で享受しましょう。
このリストにある以外でも Python フレームワークは存在します。
もし時間があれば他も選定対象として調べてみてもいいかもしれません。
Python フレームワークにはそれぞれ向き不向きがあり、どこのメリットを取るかはそのプロジェクトと相談して決めなければいけません。
あなたが最良な Python フレームワークを選べることを願ってます。