web-dev-qa-db-ja.com

Python REST(Webサービス)フレームワークの推奨事項

独自のRESTful APIを作成するためにサーバーサイドで使用するための、さまざまなPythonベースのRESTフレームワークの推奨事項のリストがありますか?できれば長所と短所があります。

ここに推奨事項を追加してください。 :)

321
darius

RESTful APIを設計するときに注意することは、GETとPOSTの融合です。それらが同じものであるかのようです。 Django 's function-based views および CherryPy のデフォルトのディスパッチャでこの間違いを犯すのは簡単ですが、どちらのフレームワークも回避策を提供しますこの問題(それぞれ クラスベースのビュー および MethodDispatcher )。

HTTP動詞は非常に重要です 、そしてこれに非常に注意しない限り、あなたは RESTアンチパターン に陥ることになるでしょう。

それを正しくするいくつかのフレームワークは web.pyFlask そして Bottle です。 mimerender ライブラリと組み合わせると(完全な開示:私が書いた)、それらはあなたがNice RESTful Webサービスを書くことを可能にします。

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 __== "__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 and Bottleフレームワークに関する情報を追加。質問があったときにもどちらも存在しませんでした。

192
Martin Blech

誰も言及していない驚いた フラスコ

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __== "__main__":
    app.run()
70
user161642

RESTful Webサービスには Django を使っています。

- 箱から出してすぐに - Djangoは私たちのニーズに対して十分にきめ細かい認証を持っていなかったことに注意してください。私たちは Django-RESTインターフェース を使いました。 [私たちはそれ以来メンテナンスの悪夢となっていたほど多くの拡張をしていたので、私たちはその後私たち自身をロールバックしました。]

人間向けのHTMLページを実装する "html" URLと、Webサービス指向の処理を実装する "json" URLの2種類のURLがあります。私たちのビュー関数はしばしばこのように見えます。

def someUsefulThing( request, object_id ):
    # do some processing
    return { a dictionary with results }

def htmlView( request, object_id ):
    d = someUsefulThing( request, object_id )
    render_to_response( 'template.html', d, ... )

def jsonView( request, object_id ):
    d = someUsefulThing( request, object_id )
    data = serializers.serialize( 'json', d['object'], fields=EXPOSED_FIELDS )
    response = HttpResponse( data, status=200, content_type='application/json' )
    response['Location']= reverse( 'some.path.to.this.view', kwargs={...} )
    return response

重要なのは、便利な機能は2つのプレゼンテーションから取り出されるということです。 JSONプレゼンテーションは通常、要求された1つのオブジェクトです。 HTMLプレゼンテーションには、人々が生産的になるのに役立つ、あらゆる種類のナビゲーション支援やその他の文脈上の手がかりが含まれることがよくあります。

jsonView関数はすべて非常によく似ているため、少し面倒です。しかしそれはPythonなので、それらを呼び出し可能なクラスの一部にするか、または助けになるならばデコレータを書いてください。

23
S.Lott

Python Web Frameworks wikiを参照してください。

フルスタックフレームワークはおそらく必要ないでしょうが、残りのリストはまだかなり長いです。

11
gimel

を見てみましょう

8
z8000

私は本当に CherryPy が好きです。これは安らかなWebサービスの例です。

import cherrypy
from cherrypy import expose

class Converter:
    @expose
    def index(self):
        return "Hello World!"

    @expose
    def fahr_to_celc(self, degrees):
        temp = (float(degrees) - 32) * 5 / 9
        return "%.01f" % temp

    @expose
    def celc_to_fahr(self, degrees):
        temp = float(degrees) * 9 / 5 + 32
        return "%.01f" % temp

cherrypy.quickstart(Converter())

これは私がCherryPyについて本当に好きなことを強調しています。これは、フレームワークを知らない人にとっても非常に理解しやすい、完全に機能する例です。このコードを実行すると、すぐに結果がWebブラウザに表示されます。例えば訪問 http:// localhost:8080/celc_to_fahr?degree = 5 あなたのウェブブラウザに122.0を表示します。

8
Eli Courtwright

REST apiを公開するためだけにDjangoを使用する理由はありません。より軽量で柔軟性の高い解決策があります。 Djangoは他にもたくさんのことをテーブルに持ってきますが、それは必ずしも必要ではありません。コードをRESTサービスとして公開するだけの場合は、特に必要ありません。

私の個人的な経験、fwiwは、いったん万能のフレームワークを手に入れたら、そのORMやプラグインなどを使い始めることができるということです。それを取り除くのはとても難しいです。

Webフレームワークを選択することは難しい決断です、そして、私はRESTapiを公開するためだけにフルスタックソリューションを選ぶことを避けます。

さて、本当にDjangoを使う必要がある、または使いたいのなら、PistonはDjangoアプリのためのNice RESTフレームワークです。

そうは言っても、CherryPyも本当に素敵に見えますが、RESTよりもRPCのようです。

サンプルを見ると(私はそれを使ったことはありません)、RESTだけが必要な場合はおそらくweb.pyが最善かつ最もクリーンです。

8
Savino Sguera

2010年に、Pylonsとrepoze.bfgコミュニティは "力を合わせて" Pyramid を作成しました。これはrepoze.bfgを最も重視したWebフレームワークです。それはその親フレームワークの哲学を保持しており、 RESTfulサービス に使用することができます。一見の価値があります。

6
asthasr

これがRESTに関するCherryPyドキュメントの議論です: http://docs.cherrypy.org/dev/progguide/REST.html

特に、MethodDispatcherと呼ばれる組み込みのCherryPyディスパッチャについて言及しています。これは、HTTP動詞識別子(GET、POSTなど)に基づいてメソッドを呼び出します。

6
nir

あらゆる種類のpython Webフレームワークが今RESTfulインターフェースを実装できるようです。

Djangoにとって、tastypieとピストンに加えて、Django-rest-frameworkは言及する価値のある有望なものです。私はすでに自分のプロジェクトの1つをスムーズに移行しました。

Django REST frameworkは、Django用の軽量なRESTフレームワークです。これは、うまく接続された、自己記述型のRESTful Web APIの構築を容易にすることを目的としています。

簡単な例:

from Django.conf.urls.defaults import patterns, url
from djangorestframework.resources import ModelResource
from djangorestframework.views import ListOrCreateModelView, InstanceModelView
from myapp.models import MyModel

class MyResource(ModelResource):
    model = MyModel

urlpatterns = patterns('',
    url(r'^$', ListOrCreateModelView.as_view(resource=MyResource)),
    url(r'^(?P<pk>[^/]+)/$', InstanceModelView.as_view(resource=MyResource)),
)

公式サイトから例を取る、上記のすべてのコードは少しテストするためにapi、自己説明されたドキュメント(石鹸ベースのウェブサービスのような)そしてサンドボックスさえ提供します。とても便利です。

リンク: http://Django-rest-framework.org/

5
Sun Liwen

Piston はDjangoアプリケーション用のRESTful APIを書くための非常に柔軟なフレームワークです。

5
DenisKolodin

私はPythonの世界では専門家ではありませんが、私は Django を使ってきました。これは優れたWebフレームワークで、落ち着いたフレームワークを作成するために使うことができます。

3
Jeremy B.

web2py は、RESTful APIを簡単に構築するためのサポートを含みます。 こちら および こちら (ビデオ)。特に、 parse_as_rest を見てください。これにより、リクエスト引数をデータベースクエリにマッピングするURLパターンを定義できます。 smart_query を使用すると、URLで任意の自然言語クエリを渡すことができます。

3
Anthony

私はあなたがDjangoを使っているのであれば Django-tastypie の代わりに Django -iston を考えることができます。ピストンよりもORM以外のデータソースに合わせる方が簡単で、優れています ドキュメント

2
Kristian

TurboGearsまたはBottleを強くお勧めします。

TurboGears:

  • djangoより冗長ではありません
  • より柔軟で、HTML指向ではない
  • それほど有名ではない

ボトル:

  • とても早い
  • とても覚えやすい
  • しかし:ミニマルで成熟していない
0
Federico

私たちは厳密なRESTサービスのためのフレームワークに取り組んでいます、チェックアウト http://prestans.googlecode.com

現時点では初期のAlphaでは、mod_wsgiとGoogleのAppEngineをテストしています。

テスターとフィードバックを探しています。ありがとう。

0
Devraj