3

私はさまざまな Web フレームワーク (Django、web.py、Pyramid、CherryPy) の経験があり、別の「ビュー/ハンドラー」に基づいてルート ディスパッチャーを実装する方が簡単で、できればクリーンなフレームワークはどれでしょうか。 「Accept」ヘッダーと HTTP メソッド 例:

Accept: application/json
POST /post/

は次のものとは異なる方法で処理されます。

Accept: text/html
POST /post/

そのため、リクエストは、MIME「application/json」および HTTP メソッド「POST」の対応するハンドラの特定のビューにルーティングされます。

私はCherryPyでそのようなものを実装する方法を知っていますが、ディスパッチャーから自動的に特定のメソッドを呼び出すのではなく、特定のメソッドを直接呼び出すため、リクエストの内部リダイレクトにCherryPyツールを使用できなくなります。もう 1 つのオプションは、完全に新しいディスパッチャーをゼロから実装することですが、それは最後のオプションです。

/post.jsonまたはのように URL で拡張機能を使用する代替手段を認識しています/post/.jsonが、同じ URL を維持したいですか?

4

3 に答える 3

12

これを簡単に実行できる1 つのフレームワークだけを探している場合は、 pyramid.

Pyramid ビューの定義は、ルートだけでなく述語で作成され、ビューはすべての述語が一致する場合にのみ一致します。そのような述語の 1 つはaccept述語です。ヘッダーに応じてビューをAccept簡単かつシンプルに切り替えます。

from pyramid.view import view_config

@view_config(route_name='some_api_name', request_method='POST', accept='application/json')
def handle_someapi_json(request):
    # return JSON

@view_config(route_name='some_api_name', request_method='POST', accept='text/html')
def handle_someapi_html(request):
    # return HTML
于 2012-12-22T15:00:27.330 に答える
5

これをDjangoで行う必要があったため、それを可能にするミドルウェアを作成しました。-ジャンゴ

コードは次のとおりです。

# A simple middleware component that lets you use a single Django
# instance to serve multiple versions of your app, chosen by the client
# using the HTTP Accept header.
# In your settings.py, map a value you're looking for in the Accept header
# to a urls.py file.
# HTTP_HEADER_ROUTING_MIDDLEWARE_URLCONF_MAP = {
#     u'application/vnd.api-name.v1': 'app.urls_v1'
# }

from django.conf import settings

class HTTPHeaderRoutingMiddleware:

    def process_request(self, request):
        try:
            for content_type in settings.HTTP_HEADER_ROUTING_MIDDLEWARE_URLCONF_MAP:
                if (request.META['HTTP_ACCEPT'].find(content_type) != -1):
                    request.urlconf = settings.HTTP_HEADER_ROUTING_MIDDLEWARE_URLCONF_MAP[content_type]
        except KeyError:
            pass # use default urlconf (settings.ROOT_URLCONF)

    def process_response(self, request, response):
        return response
于 2013-01-15T04:37:46.510 に答える
0

「内部リダイレクト」の意味がよくわかりませんが、コードを見ると、 tools.accept が lib.cptools.accept の非常に薄いラッパーあることがわかります。これは、独自のコードから簡単に呼び出すことができます。 . サーバーが送信できる Content-Types のリストを渡せば、クライアントがどちらを好むかを教えてくれます。送信するタイプとクライアントが受け入れるタイプが重複しない場合は 406 が発生します。

于 2012-12-22T00:19:23.410 に答える