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