web-dev-qa-db-ja.com

Django残りのフレームワークapi_viewと通常のビュー

私はどこでもこれについての適切な説明を見つけるために探していました、そしてそれらはすべて不足しています...Django RESTフレームワークアプリ

17
Ryan Saxe

RESTフレームワークはさておき、一般にクラスベースのビューと関数ベースのビューをいつ使用するかという問題は同じです。 DjangoのCBVは素晴らしく、柔軟性があり、ボイラープレートコードの負荷を軽減しますが、関数ベースのビューを使用する方が速くて簡単で明確な場合もあります。同じアプローチで考えてみてください。 Djangoで通常のビューを作成するにはRESTフレームワークは tutorial で紹介されているように、ビューコードを作成する両方の方法をサポートしています。

それが邪魔にならない限り、一般にCBVを使用し、関数ベースのビューとデコレータを使用してシンプルにしてください。 DjangoとREST Frameworkの両方で、リスト、ページネーション、CRUD操作などの一般的なもののロジックはすでに記述されており、クラスの形式で簡単に拡張できます。ミックスイン。ビューロジックが著しく異なることをしている場合は、関数ベースのビューが適切な場合があります。もちろん、アプリで両方のアプローチを使用できます。

19
JCotton

個人的には、APIViewの基本クラスまたは@api_viewデコレータを使用するのは、非常に具体的な/カスタムを行う必要がある場合のみです。たとえば、エンドポイントのURLのリストを表示するには、さまざまなモデルのデータを特定の方法で集約します。

通常のリスト、作成、更新、および削除操作を処理するときはいつでも、他のクラス(ビュー、ミックスインの取得、作成、更新、破棄)を使用します。

@ api_viewデコレーターを使用してアプリのすべてのエンドポイントのリストを作成する例:

from Django.core.urlresolvers import NoReverseMatch

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse

from .urls import urlpatterns


@api_view(('GET',))
def root_endpoint(request, format=None):
    """
    List of all the available resources of this RESTful API.
    """
    endpoints = []

    # loop over url modules
    for urlmodule in urlpatterns:

        # is it a urlconf module?
        try:
            urlmodule.urlconf_module
            is_urlconf_module = True
        except AttributeError:
            is_urlconf_module = False

        # if url is really a urlmodule
        if is_urlconf_module:

            # loop over urls of that module
            for url in urlmodule.urlconf_module.urlpatterns:

                # TODO: configurable skip url in settings
                # skip api-docs url
                if url.name in ['Django.swagger.resources.view']:
                    continue

                # try adding url to list of urls to show
                try:
                    endpoints.append({
                        'name': url.name.replace('api_', ''),
                        'url': reverse(url.name, request=request, format=format)
                    })
                # urls of object details will fail silently (eg: /nodes/<slug>/)
                except NoReverseMatch:
                    pass


    return Response(endpoints)

このコードは github にあります。

6
nemesisdesign