Django rest 框架 api_view 与普通视图

Posted

技术标签:

【中文标题】Django rest 框架 api_view 与普通视图【英文标题】:Django rest framework api_view vs normal view 【发布时间】:2014-02-07 08:51:35 【问题描述】:

我一直在到处寻找合适的解释,但它们都不足...您何时使用@api_view 装饰器而不是django rest framework app 的基于类的视图

【问题讨论】:

通过the views documentation阅读后,APIView 继承了基于 django 分类的 View。因此,您将在用于使用您的 API 的视图上使用 api_view 装饰器。端点。 @czarchaic 你介意提供一个详细的答案吗? 【参考方案1】:

抛开 REST 框架不谈,一般来说,何时使用基于类的视图和基于函数的视图是同一个问题。 Django 中的 CBV 非常棒、灵活并且可以节省大量样板代码,但有时使用基于函数的视图会更快、更容易和更清晰。使用与在 Django 中编写普通视图相同的方法来考虑它。 REST Framework 仅支持tutorial 中介绍的两种编写视图代码的方法。

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

【讨论】:

【参考方案2】:

就个人而言,我只在需要做一些非常具体/自定义的事情时才使用 APIView 基类或 @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)

此代码位于github。

【讨论】:

是否可以将 DjangoFilterBackend 与装饰器视图一起使用? 如果我既不扩展 APIView 也不使用 @api_view 装饰器,我可以在视图中使用 request.data 吗? @MohammedShareefC 不,我不这么认为 @MohammedShareefC request.data 是 django-rest-framework 特定的 @nemesisdesign 我知道。所以,只有当我们扩展 APIView 或使用 api_view 装饰器时,django rest 框架的特定功能才可用。

以上是关于Django rest 框架 api_view 与普通视图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django rest 框架禁用 HTML 错误页面的返回?

在 api 视图方法上禁用 CSRF(django rest 框架)

Django REST框架--关系和超链接api

Django Rest Framework IsAuthenticated 权限错误匿名用户

django rest_framework入门四-类视图APIView

django rest_framework--入门教程3