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 Framework IsAuthenticated 权限错误匿名用户