一、rest framework配置

1、安装rest framework

在django环境中安装rest-framework框架:

(automatic) C:\Users\Administrator>pip install djangorestframework

2、在django项目中进行配置

# Application definition

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', #配置djangorestframework
]

二、rest_framework下的APIView

  rest framework中的APIView是在CBV的基础上进行扩展的,CNV模式实际上时在dispatch方法中进行分发的,而APIView就是在dispatch中除了分发方法外,还扩展重构

request对象。

from rest_framework.views import APIView #导入APIView

urls.py

from crm import views
from django.conf.urls import url,include url(r'^login',views.LoginView.as_view(), name='login'),#源码入口

views.py

class LoginView(APIView):

    def get(self,request):
pass def post(self,request):
pass

可以看到执行as_view方法,自己没有去父类中寻找:

class APIView(View):#继承的View就是CBV中的View
"""
... """
#返回的是view方法,而view方法又是执行APIView的父类as_view方法
@classmethod
def as_view(cls, **initkwargs):
"""
Store the original class on the view function. This allows us to discover information about the view when we do URL
reverse lookups. Used for breadcrumb generation.
"""
... view = super(APIView, cls).as_view(**initkwargs) #执行父类as_view
view.cls = cls
view.initkwargs = initkwargs # Note: session based authentication is explicitly CSRF validated,
# all other authentication is CSRF exempt.
return csrf_exempt(view)

  可以看到这里APIView中的as_view实际执行的还是CBV中的as_view方法,最后执行的就是dispatch方法,先去LoginView中找dispatch方法,没有就去APIView中寻找

dispatch方法:

    def dispatch(self, request, *args, **kwargs):
"""
`.dispatch()` is pretty much the same as Django's regular dispatch,
but with extra hooks for startup, finalize, and exception handling.
"""
self.args = args
self.kwargs = kwargs
#rest-framework重构request对象
request = self.initialize_request(request, *args, **kwargs)
self.request = request #将分发方法的request进行赋值,此时就是重构的request
self.headers = self.default_response_headers # deprecate?
try:
self.initial(request, *args, **kwargs) # Get the appropriate handler method
#这里和CBV一样进行方法的分发
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) except Exception as exc:
response = self.handle_exception(exc) self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response

  从上面可以看到rest framework中的APIView不仅有CBV模式的特性而且,又新加了自己的东西,主要就是request的重构,可以看看request重构了什么,从initialize_request的返回值可以看出有对原request进行了封装、加入认证等:

 def initialize_request(self, request, *args, **kwargs):
"""
Returns the initial request object.
"""
parser_context = self.get_parser_context(request) return Request(
request, #传入原request
parsers=self.get_parsers(),
authenticators=self.get_authenticators(), #认证
negotiator=self.get_content_negotiator(),
parser_context=parser_context
)

此时dispatch中分发方法的request不是原request了,是已经重构的request:

#原request的调用方式
request._request

而现在重构的request,GET或者其他请求数据:

#如果是GET请求就使用
request.query_params #如果是POST或者其它请求就使用
request.data

总结:

rest framework之APIView的更多相关文章

  1. Django Rest Framework(3)-----APIView与Viewsets

    REST framework提供了一个APIView类,它是Django的View类的子类. REST framework主要的几种view以及他们之间的关系: mixins 到目前为止,我们使用的创 ...

  2. Django rest framework框架——APIview源码分析

    一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...

  3. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

  4. Django-Rest framework中文翻译-Request

    REST framework的Request类扩展自标准的HttpRequest,增加了REST framework灵活的请求解析和请求验证支持. 请求解析 REST framework的Reques ...

  5. 轻轻松松学会 DRF Django REST framework

    据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...

  6. python测试开发django-rest-framework-62.基于类的视图(APIView和View)

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

  7. Django REST framework+Vue 打造生鲜电商项目(笔记二)

    (转自https://www.cnblogs.com/derek1184405959/p/8768059.html)(有修改) 接下来开始引入django resfulframework,体现它的强大 ...

  8. django rest framework 小小心得

    這篇主要是針對於個人目前學習django rest framework的一些小小心得,在開發django而言,想要撰寫restful api,是有幾個套件可以選擇的 rest framework ta ...

  9. django rest framework用户认证

    django rest framework用户认证 进入rest framework的Apiview @classmethod def as_view(cls, **initkwargs): &quo ...

随机推荐

  1. mysql的一些语法

    alter table S61.T6198 modify  F12 varchar(30) DEFAULT NULL COMMENT '流水号'; 修改表字段结构. mysql不支持top ,只支持l ...

  2. linux 命令 - man, help, info(查看命令帮助手册)

    man, help, info - 查看命令帮助手册   help xxx  # 显示内置命令帮助信息: xxx --help  # 显示外置命令帮助信息: man xxx  # 没有内建与外部命令的 ...

  3. Linux下如何查看系统是多少位的

    在Linux命令行下输入  getconf LONG_BIT 命令

  4. nginx proxy_pass设置

    NGINX服务器的反向代理PROXY_PASS配置方法讲解 https://www.cnblogs.com/lianxuan1768/p/8383804.html Nginx配置proxy_pass转 ...

  5. 项目案例之Pipeline流水线发布JAVA项目(三)

    项目案例之Pipeline流水线发布JAVA项目(三) 链接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ 提取码:z7gj 复制这段内容后打开百度网 ...

  6. 第2篇Kubernetes架构

      一.Kubernetes 架构: Kubernetes Cluster 由 Master 和 Node 组成,节点上运行着若干 Kubernetes 服务. Master 节点 Master 是 ...

  7. loj2472[九省联考2018]IIIDX

    题意:要求构造一个d的排列使得满足d[i/k]<=d[u]且字典序最大. 标程(bzoj上并不能过): #include<bits/stdc++.h> #define mid ((l ...

  8. JavaSE---枚举

    1.概述 1.1 某些情况下,一个类的对象是  有限且固定的,eg:四季... 1.2 手动实现枚举类: 1.1.1 私有化构造器 1.1.2 将类的属性用private final修饰: 将类的实例 ...

  9. spring启动异步线程

    大纲: spring启动异步线程 spring配置线程池 一.spring启动异步线程 spring启动异步线程方法就是在方法上加上注解@Async,然后启动类或配置类上加上注解@EnableAsyn ...

  10. CF232E Quick Tortoise , Fzoj 3118

    这一题由于数据较多,我们考虑离线处理. 分治.对于两个点s,t,如果起点在mid这条横线上方,终点在下方,那么它必定会穿过mid这条线.所以只要s可以到mid上一点x,x可以到t,st就是安全的. 用 ...