Python Django rest框架api_视图与普通视图

Python Django rest框架api_视图与普通视图,python,django,api,view,django-rest-framework,Python,Django,Api,View,Django Rest Framework,我一直在到处寻找合适的解释,它们都很简短…什么时候使用@api\u视图装饰器而不是基于类的视图,我个人只在需要做一些非常具体/定制的事情时才使用APIView基类或@api\u视图装饰器。例如,要显示端点的URL列表,请以特定方式聚合来自不同模型的数据,等等 每当我处理常规的列表、创建、更新和删除操作时,我都会使用其他类(检索、创建、更新和销毁视图或mixin) 使用@api_viewdecorator创建我的应用程序的所有端点列表的示例: from django.core.urlresolve

我一直在到处寻找合适的解释,它们都很简短…什么时候使用@api\u视图装饰器而不是基于类的视图,我个人只在需要做一些非常具体/定制的事情时才使用APIView基类或@api\u视图装饰器。例如,要显示端点的URL列表,请以特定方式聚合来自不同模型的数据,等等

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

使用@api_viewdecorator创建我的应用程序的所有端点列表的示例:

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)
从django.core.urlResolver导入NoReverseMatch
从rest\u framework.decorators导入api\u视图
来自rest\u framework.response导入响应
从rest\u framework.reverse导入反向
从.url导入URL模式
@api_视图(('GET',))
def root_端点(请求,格式=无):
"""
此RESTful API的所有可用资源的列表。
"""
端点=[]
#循环url模块
对于URL模式中的URL模块:
#它是urlconf模块吗?
尝试:
urlmodule.urlconf_模块
_urlconf_module=True吗
除属性错误外:
is_urlconf_module=False
#如果url真的是一个urlmodule
如果是urlconf模块:
#在该模块的URL上循环
对于urlmodule.urlconf_module.urlpatterns中的url:
#TODO:设置中的可配置跳过url
#跳过api文档url
如果['django.swagger.resources.view']中的url.name:
持续
#尝试将url添加到要显示的url列表中
尝试:
端点.append({
'name':url.name.replace('api_',''),
“url”:反向(url.name,request=request,format=format)
})
#对象详细信息的URL将以静默方式失败(例如:/nodes/)
除NoReverseMatch外:
通过
返回响应(端点)

这段代码是打开的。

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


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

通读之后,APIView将基于django classed的视图分为子类。因此,您可以在用于使用api的视图上使用
api\u视图
decorator。端点。@Czarchic您介意给出一个详细的答案吗?可以将DjangoFilterBackend与decorator视图一起使用吗?如果我既不扩展APIView也不使用@api_view decorator,我可以在视图中使用request.data吗?@MohammedShareefC不,我不认为so@MohammedShareefCrequest.data是django rest框架specific@nemesisdesign我知道。因此,django rest框架特定的功能只有在我们扩展APIView或使用
api_view
decorator时才可用。。