Python REST(Webサービス)フレームワークの推奨事項?[閉まっている]


321

独自のRESTful APIを作成するためにサーバーサイドで使用するためのさまざまなPythonベースのRESTフレームワークの推奨事項のリストはどこにありますか?できれば賛否両論。

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


ここではweb.py使用上の良いチュートリアルだdreamsyssoft.com/blog/blog.php?/archives/...は
トリトン・マン

回答:


192

RESTful APIを設計する際に注意する必要があるのは、GETとPOSTを同じものであるかのように融合することです。Django関数ベースのビューCherryPyのデフォルトディスパッチャーでこの間違いを犯すのは簡単ですが、両方のフレームワークがこの問題を回避する方法を提供します(それぞれクラスベースのビューMethodDispatcher)。

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

それを正しく行ういくつかのフレームワークは、web.pyFlaskBottleです。mimerenderライブラリ(完全な開示:私が書いたもの)と組み合わせると、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 __name__ == "__main__":
    app.run()

サービスのロジックは1回だけ実装され、正しい表現の選択(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フレームワークに関する情報を追加。質問されたとき、どちらも存在しませんでした。


12
これは誤りです。DjangoはPOSTとGETを認識し、ビューを特定のメソッドのみに制限することを完全にサポートしています。
aehlke

20
つまり、デフォルトでは、DjangoはPOSTとGETを同じものとして処理します。これは、RESTfulサービスを実行しているときに非常に不便です。これは、強制的に実行する必要があるためです。if request.method == 'GET':do_something() elif request.method == 'POST':do_something_else()web.pyにはその問題はありません
Martin Blech

19
@Wahnfrieden:Djangoで異なるHTTP動詞を個別に処理するためのネイティブサポートがある場合(「ネイティブ」とは、「if request.method == X」が必要ないことを意味します)、ドキュメントを教えていただけませんか?
マーティンBlech 08

3
POSTとGETの融合はDjangoのクラスベースビュー(1.3で追加)には適用されませんが、以前のリリースでは有効であると思います。
ncoghlan

1
CherryPyについての答えは正しくありません。ドキュメントから:「REST(Representational State Transfer)は、CherryPyでの実装に適したアーキテクチャスタイルです。」- docs.cherrypy.org/dev/progguide/REST.html
デレク・リッツ

70

誰もフラスコに言及していません。

from flask import Flask
app = Flask(__name__)

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

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

7
質問されたとき、Flaskはそこにいませんでした...
Martin Blech

2
FlaskはPython 3.xでは動作しません
bitek

3
Flask.devがPython 3をサポート
Sean Vieira


3
ここでnoob、これはどのようにRESTfulですか?
avi

23

私たちは、使用しているジャンゴを RESTful Webサービスのために。

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なので、呼び出し可能なクラスの一部にするか、必要に応じてデコレータを記述します。


2
d = someUsefulThingのひどい繰り返し... Djangoの人でさえDRYを提案しています。
手元

5
@temoto:y = someUsefulThing(...)が「ひどい繰り返し」の場合、すべての関数とメソッドへのすべての参照は「ひどい」です。関数を2回以上参照しないようにする方法がわかりません。
S.Lott、2007

5
@temoto:「someUsefulThingに渡された引数を変更する必要がある場合、すべての呼び出しで変更を忘れる可能性があります」?何?それはどのように「ひどい」のですか?これは、関数を複数回参照することの簡単な結果です。私はあなたが何を話しているのか、それが避けられないので関数参照がどのように「ひどい」のかを理解できません。
S.Lott、2007

4
受け入れられた答えを見てください。結果式{'message': 'Hello、' + name + '!'}は、すべてのプレゼンテーションに対して1回書き込まれます。
手元

3
htmlView関数とjsonView関数は、同じデータに対して異なる表現を提供しますよね?だから、someUsefulThing(request, object_id)データ検索式があります。これで、プログラムの異なるポイントに同じ式のコピーが2つあります。受け入れられた回答では、データ式は一度だけ書かれています。のsomeUsefulThingように長い文字列で呼び出しを置き換えpaginate(request, Post.objects.filter(deleted=False, owner=request.user).order_by('comment_count'))、コードを見てください。それが私のポイントを説明してくれることを願っています。
手元

11

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

おそらく完全なスタックフレームワークは必要ありませんが、残りのリストはまだかなり長いです。


8

私は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?degrees = 50にアクセスする122.0と、Webブラウザに表示されます。


35
これは良い例ですが、RESTfulなものは何もありません。
aehlke

3
@Wahnfrieden:上記がRESTfulだと思わない理由を明確にして、残りの人たちを助けてくれませんか?私の観点からは、それはRESTの典型的な例のように見え、RESTfulシステムのルールや制約のいずれにも違反していないようです。
lilbyrdie 2009

42
簡単に言えば、上のCherryPyの例で行っていることは、メソッドを「HTTP呼び出し可能」リモートプロシージャとして公開することです。それがRPCです。それは完全に「動詞」指向です。RESTfulアーキテクチャは、サーバーが管理するリソースに焦点を当て、それらのリソースに対して非常に限定れた一連の操作を提供します。具体的には、POST(作成)、GET(読み取り)、PUT(更新)、DELETE(削除)です。これらのリソースの操作、特にPUTによるリソースの状態の変更は、「問題が発生する」主要な経路です。
verveguy 2009



8

REST APIを公開するためだけにDjangoを使用する理由はありません。軽量で柔軟なソリューションがあります。Djangoは他の多くのことをテーブルに運びますが、それらは必ずしも必要ではありません。一部のコードをRESTサービスとして公開するだけの場合は、必要ありません。

私の個人的な経験、fwiwは、万能のフレームワークがあれば、簡単であるという理由だけでORMやプラグインなどの使用を開始し、すぐに依存関係が発生することです。それを取り除くのは非常に難しいです。

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

ここで、本当にDjangoを使用する必要がある場合は、Pistonがdjangoアプリ用の優れたRESTフレームワークです。

そうは言っても、CherryPyも本当に見栄えが良いですが、RESTよりもRPCが多いようです。

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


6

RESTに関するCherryPyドキュメントでの議論は次のとおりです:http : //docs.cherrypy.org/dev/progguide/REST.html

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


6

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


Pyramidを使用すると、REST Webサービスの構築と文書化に役立つヘルパーを提供するCorniceを利用できます。
Calvin


5

あらゆる種類のPython WebフレームワークがRESTfulインターフェースを実装できるようになりました。

Djangoにとって、おいしいパイとピストンに加えて、django-rest-frameworkは注目に値する有望なものです。私のプロジェクトの1つは既にスムーズに移行しています。

Django RESTフレームワークは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、自己説明ドキュメント(SOAPベースのWebサービスなど)、さらにはサンドボックスを提供して、少しテストしています。とても便利です。

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


2
特に、ブラウズ可能なインターフェースは、開発中に多くの時間を節約しています!他にも多くの利点があるので、残りの実装を始めるすべての人が見ておくべきです。私はtastypieから始めましたが、完全にdjango-rest-frameworkに切り替えました
michel.iamit 2012

3

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


3

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


言及されたリンクは利用できなくなりました
milovanderlinden

リンクが更新されました-もう一度お試しください。
アンソニー


0

TurboGearsまたはボトルを強くお勧めします:

TurboGears:

  • ジャンゴより冗長ではない
  • より柔軟でHTML指向ではない
  • しかし:あまり有名ではありません

ボトル:

  • とても早い
  • 学ぶのはとても簡単
  • しかし:ミニマルで成熟していない

0

厳密なRESTサービスのフレームワークに取り組んでいます。http://prestans.googlecode.comをご覧ください。

現在のところAlphaの初期段階では、mod_wsgiとGoogleのAppEngineに対してテストを行っています。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.