APIView和View的区别

前言

django中编辑视图views.py有两种方式,一种是基于类的实现,另外一种是函数式的实现方式,两种方法都可以用。
REST框架提供了一个APIView类,它是Django View类的子类。

View与APIView的区别

View是Django默认的视图基类,APIView是REST framework提供的所有视图的基类, 继承自Django的View

APIViewView的不同之处在于:

  • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
  • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
  • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;APIException异常捕获
  • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

django的View部分源码

class View:
    """
    Intentionally simple parent class for all views. Only implements
    dispatch-by-method and simple sanity checking.
    """

    http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘]

    def __init__(self, **kwargs):
        """
        Constructor. Called in the URLconf; can contain helpful extra
        keyword arguments, and other things.
        """
        # Go through keyword arguments, and either save their values to our
        # instance, or raise an error.
        for key, value in kwargs.items():
            setattr(self, key, value)

REST framework的APIView继承了django的View,部分源码如下

class APIView(View):

    # The following policies may be set at either globally, or per-view.
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
    parser_classes = api_settings.DEFAULT_PARSER_CLASSES
    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
    throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
    permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
    content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS
    metadata_class = api_settings.DEFAULT_METADATA_CLASS
    versioning_class = api_settings.DEFAULT_VERSIONING_CLASS

    # Allow dependency injection of other settings to make testing easier.
    settings = api_settings

    schema = DefaultSchema()

APIView多了一些属性和方法,比如:身份认证、权限检查、流量控制

  • authentication_classes 身份认证
  • permission_classes 权限检查
  • throttle_classes 流量控制

django的View

先使用django自带的view,获取一个Card表里面的卡号信息:
models.py设计card表

# models.py
class Card(models.Model):
    ‘‘‘银行卡 基本信息 # 作者:JAY,QQ交流群:123456789‘‘‘
    card_id = models.CharField(max_length=30, verbose_name="卡号", default="")
    card_user = models.CharField(max_length=10, verbose_name="姓名", default="")
    add_time = models.DateField(auto_now=True, verbose_name="添加时间")

    class Meta:
        verbose_name_plural = ‘银行卡账户‘
        verbose_name = "银行卡账户_基本信息"

    def __str__(self):
        return self.card_id

views.py视图的编写

from django.http import JsonResponse
from rest_framework import serializers
from django.core import serializers as dj_serializers  # 避免和rest_framework里面的serializers冲突
from .models import *
from django.views.generic.base import View
import json
# 作者:上海悠悠,QQ交流群:750815713

class CardListView(View):
    ‘‘‘基于django的view实现获取card列表‘‘‘
    def get(self, request):
        data = {}
        cards = Card.objects.all()
        data[‘result‘] = json.loads(dj_serializers.serialize("json", cards))
        return JsonResponse(data)

原文地址:https://www.cnblogs.com/jiangcw/p/12412017.html

时间: 2024-10-09 19:58:03

APIView和View的区别的相关文章

私服nexus的权限问题,带admin和带view的区别

admin和view的区别只找到了这个解释: https://blog.csdn.net/tian_111222333/article/details/100159983 最终得出答案,我只需要给他们分配带view的权限就可以了. 原文地址:https://www.cnblogs.com/del88/p/11994592.html

Activity和View的区别:

activity相当于控制部分,view相当于显示部分.两者之间是多对多的关系,所有东西必须用view来显示.  viewGroup继承自view,实现了ViewManager,ViewParent接口,主要用作layout方面. Activity中加载相应的view才能显示出画面来,view是具体的画面布局(layout),由wegit控件组成. 好比view是jsp实现前台画面,activity是java程序,处理具体业务逻辑. 基本上每个activity都有对应的view, activit

(转)PartialView()与View()的区别

当我们使用razor作为页面引擎时,它的视图文件扩展名为cshtml或者vbshtml,而之前作为分部视图的ascx文件,进行razor之后,也是cshtml,这与非razor引擎有些不同,在这方面,官方并没有显式把分部视图与标准视图分开,有时,我们在开发时,可能会出现一些混乱了,今天主要来说一下,如何正确的使用分部视图! 分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为,如果你使用View()渲染视图,系统会认为你是一个标准视图,会为你加个默认的

WindowManager和Window添加View的区别(转)

WindowManager中有个添加View的函数: public void addView(View view, ViewGroup.LayoutParams params) Window中有个添加View的函数: public void addContentView(View view, ViewGroup.LayoutParams params) 弄清楚这两个类和这两个函数的作用设计到Android整个Surface系统,这里不详述,只作说明,供自己记录. 事实上,这两个函数是Activi

图层和VIEW的区别

1:view不具备显示功能,是因view内部有一个图层,才能显示出来 2:图层不具备事件功能,VIEW继承UIRespone具有处理事件功能 3:自定义的图层有一个影式动画,VIEW中图层没有隐式动画(影式动画:改变图层的某个属性,会发生动画,uiview内部图层没有影视动画)

【安卓笔记】view.getX和view.getTranslationX区别

1.view.getTranslationX计算的是该view的偏移量.初始值为0,向左偏移值为负,向右偏移值为正. 2.view.getX相当于该view距离父容器左边缘的距离,等于getLeft+getTranslationX. 示意图: 举例: 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an

drf4 视图与路由组件

APIView和View的区别 不管是View还是APIView最开始调用的都是as_view() APIView继承了View, 并且执行了View中的as_view()方法,最后把view返回了,用csrf_exempt()方法包裹后去掉了csrf的认证. 在View中的as_view方法返回了view函数,而view函数执行了self.dispatch()方法,但是这里的dispatch方法应该是我们APIView中的 去initialize_request中看下把什么赋值给了reques

视图类与视图集的基本使用

视图类与视图集的使用 一.视图类:View.APIView.GenericAPIView View是Django提供的一个视图类,类的返回值需要用到HttpResponse.JSONResponse (一).APIView 继承自Django中定义的View,但和View有两个区别: 返回数据用到的是drf框架中的Response 对数据的处理上,可以通过query_params来代替GET,data来代替POST # 创建加密分页类 class MyCursorPagination(Curso

DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等

DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 [TOC] 一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆页面吧 login.html文件内容如下: <!DOCTYPE html> <html lang="en"> <head>