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

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

【问题讨论】:

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

标签: python django api view django-rest-framework


【解决方案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 框架的特定功能才可用。
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 2016-12-15
    • 2017-03-10
    • 2022-01-24
    • 2021-06-07
    • 1970-01-01
    • 2017-10-25
    • 2015-08-04
    相关资源
    最近更新 更多