1. ホーム
  2. パイソン

[解決済み】PythonのREST(Webサービス)フレームワークのおすすめは?[クローズド]

2022-03-27 19:18:53

質問

RESTfulなAPIを書くためにサーバーサイドで使用するPythonベースのRESTフレームワークの推奨リストがどこかにありますか?できれば、長所と短所を教えてください。

ここにおすすめを自由に追加してください :)

解決方法は?

RESTful APIを設計する際に気をつけなければならないのは、GETとPOSTをあたかも同じもののように混同してしまうことです。この間違いを犯しやすいのは ジャンゴ 's 関数ベースビュー CherryPy のデフォルトのディスパッチャですが、現在ではどちらのフレームワークもこの問題を回避する方法を提供しています ( クラスベースビュー メソッドディスパッチャー それぞれ)。

HTTP-動詞は非常に重要です に陥ってしまうので、RESTではこの点に十分注意しなければなりません。 RESTのアンチパターン .

これを正しく理解しているフレームワークには、次のようなものがあります。 web.py , フラスコ ボトル . と組み合わせると マイムレンダー ライブラリ(完全公開:私が書きました)を使えば、素敵なRESTfulなウェブサービスを書くことができます。

import web
import json
from mimerender import mimerender

render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message

urls = (
    '/(.*)', 'greet'
)
app = web.application(urls, globals())

class greet:
    @mimerender(
        default = 'html',
        html = render_html,
        xml  = render_xml,
        json = render_json,
        txt  = render_txt
    )
    def GET(self, name):
        if not name: 
            name = 'world'
        return {'message': 'Hello, ' + name + '!'}

if __name__ == "__main__":
    app.run()

サービスのロジックは一度だけ実装され、正しい表現の選択(Acceptヘッダー)+適切なレンダー機能(またはテンプレート)へのディスパッチが、整然とした透明性のある方法で行われるのです。

$ curl localhost:8080/x
<html><body>Hello, x!</body></html>

$ curl -H "Accept: application/html" localhost:8080/x
<html><body>Hello, x!</body></html>

$ curl -H "Accept: application/xml" localhost:8080/x
<message>Hello, x!</message>

$ curl -H "Accept: application/json" localhost:8080/x
{'message':'Hello, x!'}

$ curl -H "Accept: text/plain" localhost:8080/x
Hello, x!

アップデート(2012年4月) : Django のクラスベースのビュー、CherryPy の MethodDispatcher、Flask と Bottle のフレームワークについての情報を追加しました。質問された当時はどちらも存在しませんでした。