独自のRESTful APIを作成するためにサーバーサイドで使用するための、さまざまなPythonベースのRESTフレームワークの推奨事項のリストがありますか?できれば長所と短所があります。
ここに推奨事項を追加してください。 :)
RESTful APIを設計するときに注意することは、GETとPOSTの融合です。それらが同じものであるかのようです。 Django 's function-based views および CherryPy のデフォルトのディスパッチャでこの間違いを犯すのは簡単ですが、どちらのフレームワークも回避策を提供しますこの問題(それぞれ クラスベースのビュー および MethodDispatcher )。
HTTP動詞は非常に重要です 、そしてこれに非常に注意しない限り、あなたは RESTアンチパターン に陥ることになるでしょう。
それを正しくするいくつかのフレームワークは web.py 、 Flask そして 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フレームワークに関する情報を追加。質問があったときにもどちらも存在しませんでした。
誰も言及していない驚いた フラスコ 。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __== "__main__":
app.run()
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なので、それらを呼び出し可能なクラスの一部にするか、または助けになるならばデコレータを書いてください。
Python Web Frameworks wikiを参照してください。
フルスタックフレームワークはおそらく必要ないでしょうが、残りのリストはまだかなり長いです。
私は本当に 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
を表示します。
REST apiを公開するためだけにDjangoを使用する理由はありません。より軽量で柔軟性の高い解決策があります。 Djangoは他にもたくさんのことをテーブルに持ってきますが、それは必ずしも必要ではありません。コードをRESTサービスとして公開するだけの場合は、特に必要ありません。
私の個人的な経験、fwiwは、いったん万能のフレームワークを手に入れたら、そのORMやプラグインなどを使い始めることができるということです。それを取り除くのはとても難しいです。
Webフレームワークを選択することは難しい決断です、そして、私はRESTapiを公開するためだけにフルスタックソリューションを選ぶことを避けます。
さて、本当にDjangoを使う必要がある、または使いたいのなら、PistonはDjangoアプリのためのNice RESTフレームワークです。
そうは言っても、CherryPyも本当に素敵に見えますが、RESTよりもRPCのようです。
サンプルを見ると(私はそれを使ったことはありません)、RESTだけが必要な場合はおそらくweb.pyが最善かつ最もクリーンです。
2010年に、Pylonsとrepoze.bfgコミュニティは "力を合わせて" Pyramid を作成しました。これはrepoze.bfgを最も重視したWebフレームワークです。それはその親フレームワークの哲学を保持しており、 RESTfulサービス に使用することができます。一見の価値があります。
これがRESTに関するCherryPyドキュメントの議論です: http://docs.cherrypy.org/dev/progguide/REST.html
特に、MethodDispatcherと呼ばれる組み込みのCherryPyディスパッチャについて言及しています。これは、HTTP動詞識別子(GET、POSTなど)に基づいてメソッドを呼び出します。
あらゆる種類の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、自己説明されたドキュメント(石鹸ベースのウェブサービスのような)そしてサンドボックスさえ提供します。とても便利です。
Piston はDjangoアプリケーション用のRESTful APIを書くための非常に柔軟なフレームワークです。
私はPythonの世界では専門家ではありませんが、私は Django を使ってきました。これは優れたWebフレームワークで、落ち着いたフレームワークを作成するために使うことができます。
web2py は、RESTful APIを簡単に構築するためのサポートを含みます。 こちら および こちら (ビデオ)。特に、 parse_as_rest
を見てください。これにより、リクエスト引数をデータベースクエリにマッピングするURLパターンを定義できます。 smart_query
を使用すると、URLで任意の自然言語クエリを渡すことができます。
私はあなたがDjangoを使っているのであれば Django-tastypie の代わりに Django -iston を考えることができます。ピストンよりもORM以外のデータソースに合わせる方が簡単で、優れています ドキュメント 。
TurboGearsまたはBottleを強くお勧めします。
TurboGears:
ボトル:
私たちは厳密なRESTサービスのためのフレームワークに取り組んでいます、チェックアウト http://prestans.googlecode.com
現時点では初期のAlphaでは、mod_wsgiとGoogleのAppEngineをテストしています。
テスターとフィードバックを探しています。ありがとう。