Django休息框架api_view与普通视图

Rya*_*axe 17 python api django view django-rest-framework

我一直在寻找各处寻找一个合适的解释,它们都很简短... 你什么时候使用@api_view装饰器而不是基于类的视图与django rest框架应用程序

JCo*_*ton 19

除了REST框架之外,一般来说,何时使用基于类的视图与基于函数的视图的问题相同.Django中的CBV非常棒,灵活且可以节省大量的样板代码,但有时候使用基于函数的视图更快,更简单,更清晰.用你在Django中编写普通视图所采用的相同方法来考虑它.REST Framework简单地支持编写视图代码的两种方法,如教程中介绍的那样.

通常使用CBV,除非它妨碍你,然后使用基于函数的视图和装饰器保持简单.在Django和REST Framework中,列表,分页和CRUD操作等典型事物的逻辑已经编写完成,并且可以通过类和mixin的形式轻松扩展.如果您的视图逻辑正在做一些明显不同的事情,那么基于函数的视图可能是合适的.当然,您可以在应用中使用这两种方法.


nem*_*ign 6

就个人而言,仅在需要执行非常特定/自定义的操作时,才使用API​​View基类或@api_view装饰器。例如,要显示端点的URL列表,请以特定方式聚合来自不同模型的数据,依此类推。

每当我处理通常的列表,创建,更新和删除操作时,我都会使用其他类(检索,创建,更新和销毁视图或Mixins)。

使用@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)
Run Code Online (Sandbox Code Playgroud)

这段代码在github上