2023年9月27日水曜日

FastAPIの検索結果 Q:質問:APIを構築したとき高速なレスポンスをするとしてpython (fastapi),node.js (Fastify) 、go言語,rustがありますが学びやすさ、将来性などでどれがおすすめですか?

A:回答

 · 
フォロー

この手の質問 quora でもよそでもわりとよく聞くんですが、言語の差っていま殆ど無いんですよマジで。

純粋に性能で比較すると rust が最速なのは間違いないですが、 普通のサーバーで普通のサービスを提供する限り、どれを選んでも性能不足を感じる場面はまずないと言って良いでしょう。

将来性については、いま最新を使えばどれも3年は確実に使えます。アップデートのメンテコストをかけるつもりがあれば5年も余裕です。一方で、あなたが作ったサービスが3年後も生きてる可能性はわりと低いです。そんなことない?そりゃすみません。

エコシステムが充実しててサンプルコードが多いのは python になりますかねえ。最新の python なら型も書けますし。

nodejs はどうなんかねー、ブラウザが import をサポートしたので babel & webpack が要らなくなり、import の拡張子の問題で typescript と node の仕様がweb標準と合わなくて揉めてるのが2022年。この変更はエコシステムの破壊をもたらすのでわりとデカい話です。もうあらゆる面で Deno の方が良いのに人類が nodejs にしがみついているので私は軽く絶望しています笑

go は私はあんま書く気無いですがファンは多いので10年は続くでしょう、私も強く反対はしません。

rust は最高オブ最高。「難しい」という印象が先行してますが、これがそんなに難しく見えますか?

  1. use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder}; 
  2.  
  3. #[get("/")] 
  4. async fn hello() -> impl Responder { 
  5. HttpResponse::Ok().body("Hello world!") 
  6. } 
  7.  
  8. #[post("/echo")] 
  9. async fn echo(req_body: String) -> impl Responder { 
  10. HttpResponse::Ok().body(req_body) 
  11. } 
  12.  
  13. async fn manual_hello() -> impl Responder { 
  14. HttpResponse::Ok().body("Hey there!") 
  15. } 
Getting Started | Actix
Installing Rust
pythonのFastAPIは、「高速: NodeJS や Go 並みのとても高いパフォーマンス」とありますが、なぜ速いのでしょうか?
 · 
フォロー

基本的にWebAPIはHTTP通信やDBとのやり取りなどのIOが主なボトルネックですので非同期処理に対応していることが重要です。FastAPIでは従来のPythonの標準的なWSGIではなく、非同期処理に対応したASGIに準拠している点がFlaskなどとの大きな違いです。内部でStartletteを利用し、ASGIの実行環境としてUvicornを使用するなどの点は他の回答の通りです。

もちろんちゃんとASGIの利点を生かすためにはasync defを使用して関数を定義し、IO処理ではasync/awaitをしっかり利用することが不可欠です。DBとの接続も非同期処理に対応したものを使用する必要があります

 。

しかし、それでもnodejsやGo並みというのはかなり盛っているといわざるを得ません。マイクロベンチマークでいくら速くても言語レベルで非同期前提のそれらの言語と比べると必ず様々なオーバーヘッドが出てきます。ただ、FlaskなどのWSGIの時代と比べるとはるかに進化しているということは確実です。

私が思うにFastAPIの一番の売りはPythonのType Hintを実際にデータのバリデーションに使用したり、OpenAPIドキュメントの自動生成に活用しているという点です。特に後者については同等の機能を有した他言語のフレームワークをいまだに見たことがなく、私はAPIサーバーを作る場合は第一候補は必ずFastAPIです。

杜 世橋
 · 2年前
Pythonの勉強をしようと思っています(win機)。webアプリを作る上で今入門するならどんなフレームワークがおすすめですか?
Djangoを勧める回答が多いですが、フルスタックフレームワークはブラックボックスな部分が多くて初学者にはお勧めしません。また、近年ではReactなどのSPAを利用するケースが増えてきていますのでサーバー側はテンプレートエンジンなど使用せずにAPIに徹するというのがいいと思っています。そこで私が一番お勧めするのはFlask に代わって期待されているFastAPI です。 このFastAPIはWSGIに代わる、ASGIという非同期処理のPythonのWebappの仕様に対応していてその名の通りとてもパフォーマンスが高いのですが、そんなことよりも素晴らしいのはPythonの型を存分に活かしている点です。 公式Webのコードを引用します。 from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q} このように一見Flaskとほとんど同じ書き方なのですが、注目するポイントは関数の引数に型情報を付けてあげると自動的にHTTPリクエストのパラメータのvalidationにも適用されるという点です。例えばこの例では`item_id: int`となっていますので `GET /items/1` は有効ですが `GET /items/item1` というリクエストが来ると自動的に422エラーになってitem_idの型が違うというメッセージがクライアントに返されます。 GET /items/item1 HTTP/1.1 HTTP/1.1 422 Unprocessable Entity content-length: 104 content-type: application/json date: Wed, 19 May 2021 00:42:29 GMT server: uvicorn { "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] } この型チェックはpathパラメータだけでなく、query, form, bodyのjsonすべてに対して適用可能です。しかも、なんとこれらの情報を利用して自動でOpenAPIのドキュメントまで生成してくれます。 それ以外にもやはり新しいだけあって非常に設計が良くなされており、まだまだ比較的新しいのですが、すでにWeb上に日本語の記事がいくつも上がっていてその注目度の高さがうかがえます。

脚注

DjangoとFastapiどちらのほうが好きですか?
 · 
フォロー

どっちも使ってます。

Djangoのテスト環境含めたサポートは中規模からは重宝します。

FastAPIはお手軽なのでAPIをとりあえず提供するには簡単なので使ってます。その代わりORMとかはないので別途提供するので面倒ですが。

ということで、どっちもどっちなので両方使えば良いのでは。

APIを作るときに今学ぶならruby (rails) か、Go、c++(dragon),scala、python(fastapi),rustと言われたらどれを選びますか?
 · 
フォロー

APIというのはWeb APIサーバーのことですね。

GoかPythonのFastAPIを推します。

C++とRustは確かにGoよりも速いですが、それはあくまでCPU boundな処理の場合であってWebAPIのようにIO boundの場合にはそれほど優位ではありません。

Rubyはどんどん利用者が減っていっている言語です。PHPだったら迷います。

Scalaは以前はPlay Frameworkが一時期流行った気もしますが、なんだかんだJVM系はやっぱりJavaが一番強くてSpring Frameworkが多いようです。

Goは静的型付け言語ですが,PythonもType HintとMypyを組み合わせればほぼ静的型付け言語並みの方チェックができます。そしてなんといってもFastAPIが素晴らし過ぎます。

本当にパフォーマンスが要求される場合はGo、それ以外のほとんどの場合はPython+FastAPIです。


関連回答

杜 世橋
 · 1年前
pythonのFastAPIは、「高速: NodeJS や Go 並みのとても高いパフォーマンス」とありますが、なぜ速いのでしょうか?
基本的にWebAPIはHTTP通信やDBとのやり取りなどのIOが主なボトルネックですので非同期処理に対応していることが重要です。FastAPIでは従来のPythonの標準的なWSGIではなく、非同期処理に対応したASGIに準拠している点がFlaskなどとの大きな違いです。内部でStartletteを利用し、ASGIの実行環境としてUvicornを使用するなどの点は他の回答の通りです。 もちろんちゃんとASGIの利点を生かすためにはasync defを使用して関数を定義し、IO処理ではasync/awaitをしっかり利用することが不可欠です。DBとの接続も非同期処理に対応したものを使用する必要があります 。 しかし、それでもnodejsやGo並みというのはかなり盛っているといわざるを得ません。マイクロベンチマークでいくら速くても言語レベルで非同期前提のそれらの言語と比べると必ず様々なオーバーヘッドが出てきます。ただ、FlaskなどのWSGIの時代と比べるとはるかに進化しているということは確実です。 私が思うにFastAPIの一番の売りはPythonのType Hintを実際にデータのバリデーションに使用したり、OpenAPIドキュメントの自動生成に活用しているという点です。特に後者については同等の機能を有した他言語のフレームワークをいまだに見たことがなく、私はAPIサーバーを作る場合は第一候補は必ずFastAPIです。
杜 世橋
 · 2年前
pythonのfastAPIは大規模開発に向いていますか?
向いていると思います。 他の回答に挙げられている問題点としては動的型付けであることとパフォーマンスですが、FastAPIはそれらもしっかり考慮されています。 まずパフォーマンスについてはFastAPIは従来のWSGIではなくてASGIという非同期処理に対応した新しいPythonのWebAPI仕様に則っていてasync/await構文をしっかり理解して使用し、DBコネクタ関連もasyncio対応の物に置き換えればGoやNodejsレベルとは言いませんが十分に高速に動作します。DjangoやFlaskなどの従来のWSGIよりかは全然速い。ベンチマークの取り方に依存しますが、非同期処理を正しく書ければ10倍はでます。 動的型付けの件についてはFastAPIと内部で利用しているPydanticはPython 3.5から登場したtype hinting機能をエディタの補完補助にとどまらず、積極的に機能として利用していて自動的にリクエストパラメータのvalidationやドキュメント(OpenAPI)の自動生成が可能になっています。特に後者のOpenAPIドキュメント生成は他のフレームワークには見られない機能でこれだけでも採用する価値があると思います。 後発であることがゆえに採用例や情報が少ないというのが懸念になるかもしれませんが、FastAPIは公式サイトのドキュメントが完璧に整備されており、英語はもちろん、日本語でもすでに多くの紹介記事があります。Microsoft, Uber, Netflixなどの一流テック企業も採用しています。 Opinions¶ "[...] I'm using FastAPI a ton these days. [...] I'm actually planning to use it for all of my team's ML services at Microsoft. Some of them are getting integrated into the core Windows product and some Office products." Kabir Khan - Microsoft "We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]" Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber "Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]" Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix
杜 世橋
 · 2年前
Pythonの勉強をしようと思っています(win機)。webアプリを作る上で今入門するならどんなフレームワークがおすすめですか?
Djangoを勧める回答が多いですが、フルスタックフレームワークはブラックボックスな部分が多くて初学者にはお勧めしません。また、近年ではReactなどのSPAを利用するケースが増えてきていますのでサーバー側はテンプレートエンジンなど使用せずにAPIに徹するというのがいいと思っています。そこで私が一番お勧めするのはFlask に代わって期待されているFastAPI です。 このFastAPIはWSGIに代わる、ASGIという非同期処理のPythonのWebappの仕様に対応していてその名の通りとてもパフォーマンスが高いのですが、そんなことよりも素晴らしいのはPythonの型を存分に活かしている点です。 公式Webのコードを引用します。 from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q} このように一見Flaskとほとんど同じ書き方なのですが、注目するポイントは関数の引数に型情報を付けてあげると自動的にHTTPリクエストのパラメータのvalidationにも適用されるという点です。例えばこの例では`item_id: int`となっていますので `GET /items/1` は有効ですが `GET /items/item1` というリクエストが来ると自動的に422エラーになってitem_idの型が違うというメッセージがクライアントに返されます。 GET /items/item1 HTTP/1.1 HTTP/1.1 422 Unprocessable Entity content-length: 104 content-type: application/json date: Wed, 19 May 2021 00:42:29 GMT server: uvicorn { "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] } この型チェックはpathパラメータだけでなく、query, form, bodyのjsonすべてに対して適用可能です。しかも、なんとこれらの情報を利用して自動でOpenAPIのドキュメントまで生成してくれます。 それ以外にもやはり新しいだけあって非常に設計が良くなされており、まだまだ比較的新しいのですが、すでにWeb上に日本語の記事がいくつも上がっていてその注目度の高さがうかがえます。
杜 世橋
 · 1年前
なぜRustなの?と言われたらなんと答えますか?
何を作るかによります。 IOが中心のWebのバックエンドでしたら特にRustのメリットはあまり感じません。GoでもTypescriptでもKotlinでもPythonでも好きなもので書いてください。PythonもFastAPI というフレームワークを使えば非同期処理が簡単に行えるだけでなく、型注釈(Type Hint)の情報を上手く使ってデータのバリデーションやドキュメントの自動生成までできます。mypy というlinterと組み合わせればTypescriptと同じくらい型安全になります。 機械学習はCPUの負荷が高い分野ですが、ここでもあまりRustのメリットはありません。Python + C++という組み合わせが現状では最強です。機械学習はほとんどのアルゴリズムのボトルネックが行列計算であり、NumPyのエコシステムによってCやFortranなどで書かれたBLAS/Lapack、あるいはGPUに上手くオフロードできています。そしてpybind11 というC++のライブラリを使用することで簡単にC++の関数をPythonから呼ぶことができます。実際にPyTorchなど多くの機械学習のOSSはこれを利用しています。(Cythonを利用しているものもありますが、最近はpybind11の方が採用例が多いです) 私が主にRustを利用しているのは行列計算があまり関係ない組み合わせ最適化の領域です。特に目的関数や制約条件が線形でなく、ヒューリスティックなアルゴリズムを書く必要がある場合です。こういった問題の場合は前述のNumPyをはじめとしたPythonの資源を活用できなく、Pythonでforループを明示的に書いてアルゴリズムを実装してもパフォーマンスが出ません。したがってC++かRustが候補にあがります。以前はC++で書いていましたが、Rustはより洗練されていて、特にCargoを用いて簡単にプロジェクトのセットアップや依存ライブラリの管理ができ、ユニットテストも標準機能で備えているなど言語仕様と言うよりかはビルドシステムがC++よりもかなり親切な点がいいと思います。 ちなみに線形の組み合わせ最適化の場合はOR-Tools などの既存のライブラリをPythonから使えばいいです。
APIを作るときに今学ぶならruby (rails) か、Go、c++(dragon),scala、python(fastapi),rustと言われたらどれを選びますか?

この場合であれば、Python(fastapi)またはGo langがおすすめですね。

バックエンドの開発であれば型があった方が嬉しいのでそういった所からGoが一番良いかと思いますが、Pythonには型アノテーションがあるので擬似的にではありますが、型のようなものを用意して開発する事はできます。

この2つの理由からPythonとGo langはオススメですね。C++, Rustに関しては型はありますがそれ以上にメモリ周りの事を気にしないといけないので、この中でどれを選びますか?と言われた場合であれば優先して選びたい理由はあまりないです。

また、ScalaにしろRuby(on rails)にしろ、PythonやGo langで書く選択肢があるならばわざわざ選ぶ動機はあまりないのかなぁと思いました。

選択肢に出てきていないもので恐縮ですが、こういった並びにされるのであればNode.jsで書くのもアリかと思います。フロントエンドではどうせJS/TSを使わないといけないので、APIを作るという状況下においてフロントの開発もある程度必要になるケースがある事を考えると、Node.jsもPythonやGo langに並んで有力な候補になるかと思います。

FlaskやFastAPIってシンプルが故に自前でディレクトリ構造などを作成していきますが、それだったら結局Djangoの方が良いと思うのですが、どうでしょうか?
 · 
フォロー

一般にDjangoのようなフルスタックフレームワークは他のやり方、例えばDDD(ドメイン駆動設計)とは相性が悪いです。

無理に入れようとすると屋上屋を架すようなやり方になるか、Djangoの強みが台無しになり、最初から他のマイクロフレームワークでいいじゃんとなります。

あと、Djangoはまだ非同期対応が十分でなく、型ヒント対応もイマイチです。APIを使うときはFastAPIを使う方がいいでしょう。

とは言え慣れているに越したことはないので、まずはDjangoでやってみるのもアリだと思います。

linux上でApacheが動作するディレクトリって/var/www/配下だと思っているのですが、 Apache上でFastAPIを動作させたい場合、ここに対象のファイルを置けば良いのでしょうか?
 · 
フォロー

Python はあまり詳しくないですが、私の勘は「No」と言っています。

Apache は本来は html や画像ファイルなど、ファイルそのものを http で返すためのもので、その置き場が /var/www 以下です。なので、普通に考えると標準的な設定で python のファイルをそこに置いたら python のソースコードをそのままブラウザに返すことになります。(業務でこれやったら事故です)

Apache に python 実行用の modを乗せて cgi として動かすんですかね?その場合、 cgi の起動ファイルは www 以下に置くことになると思いますが、そこから参照する python ファイルはすべて www の外に置くべきですね。FastAPI をCGI起動するのもなかなかトリッキーな感じですが。。

ふつう、 FastAPI のアプリを起動する場合は apache を使わずに uvicorn のようなASGI サーバを使うんではないでしょうか。

Uvicorn
An ASGI web server, for Python. Introduction ¶ Uvicorn is an ASGI web server implementation for Python. Until recently Python has lacked a minimal low-level server/application interface for async frameworks. The ASGI specification fills this gap, and means we're now able to start building a common set of tooling usable across all async frameworks. Uvicorn currently supports HTTP/1.1 and WebSockets . Quickstart ¶ Install using pip : This will install uvicorn with minimal (pure Python) dependencies. $ pip install 'uvicorn[standard]' This will install uvicorn with "Cython-based" dependencies (where possible) and other "optional extras". In this context, "Cython-based" means the following: the event loop uvloop will be installed and used if possible. uvloop is a fast, drop-in replacement of the built-in asyncio event loop. It is implemented in Cython. Read more here . The built-in asyncio event loop serves as an easy-to-read reference implementation and is there for easy debugging as it's pure-python based. the http protocol will be handled by httptools if possible. Read more about comparison with h11 here . Moreover, "optional extras" means that: the websocket protocol will be handled by websockets (should you want to use wsproto you'd need to install it manually) if possible. the --reload flag in development mode will use watchfiles . windows users will have colorama installed for the colored logs. python-dotenv will be installed should you want to use the --env-file option. PyYAML will be installed to allow you to provide a .yaml file to --log-config , if desired. Create an application: main.py async def app ( scope , receive , send ): assert scope [ 'type' ] == 'http' await send ({ 'type' : 'http.response.start' , 'status' : 200 , 'headers' : [ [ b 'content-type' , b 'text/plain' ], ], }) await send ({ 'type' : 'http.response.body' , 'body' : b 'Hello, world!' , }) Run the server: Usage ¶ The uvicorn command line tool is the easiest way to run your application. Command line options ¶ $ uvicorn --help Usage: uvicorn [OPTIONS] APP Options: --host TEXT Bind socket to this host. [default: 127.0.0.1] --port INTEGER Bind socket to this port. If 0, an available port will be picked. [default: 8000] --uds TEXT Bind to a UNIX domain socket. --fd INTEGER Bind to socket from this file descriptor. --reload Enable auto-reload. --reload-dir PATH Set reload directories explicitly, instead of using the current working directory. --reload-include TEXT Set glob patterns to include while watching for files. Includes '*.py' by default; these defaults can be overridden with `--reload- exclude`. This option has no effect unless

さらに前面に apache を立たせるケースもあるようですが、 apache uvicorn 間はソケット通信するだけなので、 python ファイル群はどこにあってもよく、一般に www 以下は避けるかと思われます。

まともな回答がなかったのでとりあえず書きましたが、あとはパイソニスタの人頼む。

pythonのfastAPIは大規模開発に向いていますか?
 · 
フォロー

向いていると思います。

他の回答に挙げられている問題点としては動的型付けであることとパフォーマンスですが、FastAPIはそれらもしっかり考慮されています。

まずパフォーマンスについてはFastAPIは従来のWSGIではなくてASGIという非同期処理に対応した新しいPythonのWebAPI仕様に則っていてasync/await構文をしっかり理解して使用し、DBコネクタ関連もasyncio対応の物に置き換えればGoやNodejsレベルとは言いませんが十分に高速に動作します。DjangoやFlaskなどの従来のWSGIよりかは全然速い。ベンチマークの取り方に依存しますが、非同期処理を正しく書ければ10倍はでます。

動的型付けの件についてはFastAPIと内部で利用しているPydanticはPython 3.5から登場したtype hinting機能をエディタの補完補助にとどまらず、積極的に機能として利用していて自動的にリクエストパラメータのvalidationやドキュメント(OpenAPI)の自動生成が可能になっています。特に後者のOpenAPIドキュメント生成は他のフレームワークには見られない機能でこれだけでも採用する価値があると思います。

杜 世橋
 · 2年前
Pythonの勉強をしようと思っています(win機)。webアプリを作る上で今入門するならどんなフレームワークがおすすめですか?
Djangoを勧める回答が多いですが、フルスタックフレームワークはブラックボックスな部分が多くて初学者にはお勧めしません。また、近年ではReactなどのSPAを利用するケースが増えてきていますのでサーバー側はテンプレートエンジンなど使用せずにAPIに徹するというのがいいと思っています。そこで私が一番お勧めするのはFlask に代わって期待されているFastAPI です。 このFastAPIはWSGIに代わる、ASGIという非同期処理のPythonのWebappの仕様に対応していてその名の通りとてもパフォーマンスが高いのですが、そんなことよりも素晴らしいのはPythonの型を存分に活かしている点です。 公式Webのコードを引用します。 from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q} このように一見Flaskとほとんど同じ書き方なのですが、注目するポイントは関数の引数に型情報を付けてあげると自動的にHTTPリクエストのパラメータのvalidationにも適用されるという点です。例えばこの例では`item_id: int`となっていますので `GET /items/1` は有効ですが `GET /items/item1` というリクエストが来ると自動的に422エラーになってitem_idの型が違うというメッセージがクライアントに返されます。 GET /items/item1 HTTP/1.1 HTTP/1.1 422 Unprocessable Entity content-length: 104 content-type: application/json date: Wed, 19 May 2021 00:42:29 GMT server: uvicorn { "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] } この型チェックはpathパラメータだけでなく、query, form, bodyのjsonすべてに対して適用可能です。しかも、なんとこれらの情報を利用して自動でOpenAPIのドキュメントまで生成してくれます。 それ以外にもやはり新しいだけあって非常に設計が良くなされており、まだまだ比較的新しいのですが、すでにWeb上に日本語の記事がいくつも上がっていてその注目度の高さがうかがえます。

後発であることがゆえに採用例や情報が少ないというのが懸念になるかもしれませんが、FastAPIは公式サイトのドキュメントが完璧に整備されており、英語はもちろん、日本語でもすでに多くの紹介記事があります。Microsoft, Uber, Netflixなどの一流テック企業も採用しています。

Opinions

"[...] I'm using FastAPI a ton these days. [...] I'm actually planning to use it for all of my team's ML services at Microsoft. Some of them are getting integrated into the core Windows product and some Office products."

Kabir Khan - Microsoft

"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]"

Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber

"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix

FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production
Pythonの勉強をしようと思っています(win機)。webアプリを作る上で今入門するならどんなフレームワークがおすすめですか?
 · 
フォロー

Djangoを勧める回答が多いですが、フルスタックフレームワークはブラックボックスな部分が多くて初学者にはお勧めしません。また、近年ではReactなどのSPAを利用するケースが増えてきていますのでサーバー側はテンプレートエンジンなど使用せずにAPIに徹するというのがいいと思っています。そこで私が一番お勧めするのはFlask

に代わって期待されているFastAPIです。

このFastAPIはWSGIに代わる、ASGIという非同期処理のPythonのWebappの仕様に対応していてその名の通りとてもパフォーマンスが高いのですが、そんなことよりも素晴らしいのはPythonのを存分に活かしている点です。

公式Webのコードを引用します。

  1. from typing import Optional 
  2. from fastapi import FastAPI 
  3.  
  4. app = FastAPI() 
  5.  
  6. @app.get("/") 
  7. def read_root(): 
  8.   return {"Hello": "World"} 
  9.  
  10. @app.get("/items/{item_id}") 
  11. def read_item(item_id: int, q: Optional[str] = None): 
  12.   return {"item_id": item_id, "q": q} 

このように一見Flaskとほとんど同じ書き方なのですが、注目するポイントは関数の引数に型情報を付けてあげると自動的にHTTPリクエストのパラメータのvalidationにも適用されるという点です。例えばこの例では`item_id: int`となっていますので `GET /items/1` は有効ですが `GET /items/item1` というリクエストが来ると自動的に422エラーになってitem_idの型が違うというメッセージがクライアントに返されます。

  1. GET /items/item1 HTTP/1.1 
  2.  
  3.  
  4. HTTP/1.1 422 Unprocessable Entity 
  5. content-length: 104 
  6. content-type: application/json 
  7. date: Wed, 19 May 2021 00:42:29 GMT 
  8. server: uvicorn 
  9.  
  10. { 
  11. "detail": [ 
  12. { 
  13. "loc": [ 
  14. "path", 
  15. "item_id" 
  16. ], 
  17. "msg": "value is not a valid integer", 
  18. "type": "type_error.integer" 
  19. } 
  20. ] 
  21. } 

この型チェックはpathパラメータだけでなく、query, form, bodyのjsonすべてに対して適用可能です。しかも、なんとこれらの情報を利用して自動でOpenAPIのドキュメントまで生成してくれます。

それ以外にもやはり新しいだけあって非常に設計が良くなされており、まだまだ比較的新しいのですが、すでにWeb上に日本語の記事がいくつも上がっていてその注目度の高さがうかがえます。

脚注

不安です。今までLaravelで自社のCMSやweb制作、今はDjangoでの開発に切り替えました。機械学習や統計は皆無なので結果的に将来性がないような気がします。Laravelに戻すべきでしょうか?
 · 
フォロー

ウェブ開発についてはLaravelのほうが案件が多いと思うので無理にDjangoを利用する必要はありません。機械学習関連のモデルのデプロイはFlaskやFastAPIなどのシンプルなフレームワークで数個のエンドポイントを作り、それをLaravelからProxyすれば十分です。

ちなみに私はPythonで機械学習や最適化関連の仕事をしていてWebAPIも時々開発しますが、Djangoは使ったことありません。今でしたらPythonはFastAPIが一番いいです。

杜 世橋
 · 2年前
Pythonの勉強をしようと思っています(win機)。webアプリを作る上で今入門するならどんなフレームワークがおすすめですか?
Djangoを勧める回答が多いですが、フルスタックフレームワークはブラックボックスな部分が多くて初学者にはお勧めしません。また、近年ではReactなどのSPAを利用するケースが増えてきていますのでサーバー側はテンプレートエンジンなど使用せずにAPIに徹するというのがいいと思っています。そこで私が一番お勧めするのはFlask に代わって期待されているFastAPI です。 このFastAPIはWSGIに代わる、ASGIという非同期処理のPythonのWebappの仕様に対応していてその名の通りとてもパフォーマンスが高いのですが、そんなことよりも素晴らしいのはPythonの型を存分に活かしている点です。 公式Webのコードを引用します。 from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q} このように一見Flaskとほとんど同じ書き方なのですが、注目するポイントは関数の引数に型情報を付けてあげると自動的にHTTPリクエストのパラメータのvalidationにも適用されるという点です。例えばこの例では`item_id: int`となっていますので `GET /items/1` は有効ですが `GET /items/item1` というリクエストが来ると自動的に422エラーになってitem_idの型が違うというメッセージがクライアントに返されます。 GET /items/item1 HTTP/1.1 HTTP/1.1 422 Unprocessable Entity content-length: 104 content-type: application/json date: Wed, 19 May 2021 00:42:29 GMT server: uvicorn { "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] } この型チェックはpathパラメータだけでなく、query, form, bodyのjsonすべてに対して適用可能です。しかも、なんとこれらの情報を利用して自動でOpenAPIのドキュメントまで生成してくれます。 それ以外にもやはり新しいだけあって非常に設計が良くなされており、まだまだ比較的新しいのですが、すでにWeb上に日本語の記事がいくつも上がっていてその注目度の高さがうかがえます。
Web開発初心者におすすめするフレームワークはなんですか?
 · 
フォロー

FastAPI という新星をあえてお勧めします。

Alternatives, Inspiration and Comparisons

を読むと分かりますが、Pythonの過去のあらゆるWeb関連のライブラリを研究しており、まさにstate of the artと呼べるものだと思います。今後Flaskに代わってPythonのWebフレームワークのトップになると思っています。

私が一番好きな機能はドキュメントの自動作成機能です。

Features - FastAPI

Ruby on Rails よりも優れているとあなたが思うフルスタックフレームワークと、その理由を教えてもらえますか?言語問わず。
 · 
フォロー

A2A

フルスタックフレーム自体があまり好きではありません。覚えることが多すぎなうえ、ちょっと違うことをやりたいと思ったときにフレームワーク自体を改造しないといけないことがあったからです。今はフロントはスマホとwebで別々に使うことも多いのでテンプレートエンジンとかも邪魔なだけです。

フルスタックでなくてもいいのなら好きなのはシンプルかつエレガントなPythonのFastAPI

 とGolangのEcho です。とくにFastAPIのドキュメント自動生成は便利です。

脚注

静的型と動的型のどちらが好きですか? それはなぜですか?
 · 
フォロー

普段Pythonばっかり書いているにもかかわらず静的が好きです。

言葉悪いですが、動的のメリットって手抜きして書ける点以外に見当たらないんですよね。それも最近はC++やJavaなどでも型推論が賢くなってきているのでほとんど優位でなくなってきています。

普段動的型の言語で書く際にも結局は関数の引数や戻り値の型は必ずいくつかの種類に限定しますよね。というか大抵は一種類に固定です。静的型言語でしたら引数や戻り値の型と名前を見るだけでその意味がおおよそ分かります。一方で動的の場合は型の情報が落ちているのでその分ドキュメントなどで補わなければなりません。結局書く分量はあまり変わらず、型のチェックができない分だけ損です。

そういった背景もあってTypescriptが登場したり、あるいはPythonにもType Hintingが追加されたのだと思います。

ちなみにPythonのType Hintingは最初はIDEのコード補完やmypyなどによる型チェックのための物でしたが、最近はFastAPIなどのようにむしろ積極的にこの情報を利用して挙動を変えたりするフレームワークも登場しています。Pythonはどんどん静的型言語になっているいんですよw。

Path Parameters - FastAPI (型情報によって挙動が変わる例)

0 コメント:

コメントを投稿