面向对象封装

面向对象封装导入

# 1.将子类共有的方法抽离形成父类方法
# 2.子类使用共有方法,使用的是父类方法
# 3.共有方法中的资源,在子类使用方法时,获取的是子类资源
class MyClass:
name = None
@classmethod
def test(cls):
print(cls.name)
class AClass(MyClass):
name = "AClass"
class BClass(MyClass):
name = "BClass"
AClass.test()
BClass.test()

面向对象的封装

drf视图层面向对象封装应用

# drf已经做了 CBV的面向对象封装,且还做了一步精髓之笔,重写了as_view()
class GetListClass: pass # get_list
class PostOneClass: pass # post_one
class GetOneCLass: pass # get_one
class PutOneClass: pass # put_one
class DeleteOneClass: pass # delete_one # get_list | post_one | get_one | put_one | delete_one
class MyClass(GetListClass,PostOneClass,GetOneCLass,PutOneClass,DeleteOneClass): pass # get_list | post_one
class Books(GetListClass,PostOneClass): pass
# get_list | post_one | get_one | put_one | delete_one
class BookView(MyClass): pass
# get_list | post_one | get_one | put_one | delete_one
class AuthorView(MyClass): pass

drf视图层面向对象封装

基础的五大接口:基础

数据准备

# settings.py
INSTALLED_APPS=[
#.....
'rest_framework',
] # models.py 手动形成数据
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
author = models.ManyToManyField(to='Author', db_constraint=False) class Author(models.Model):
name = models.CharField(max_length=32)
author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.SET_NULL, null=True, db_constraint=False) class AuthorDetail(models.Model):
age = models.IntegerField()
telephone = models.CharField(max_length=32) # objectjson.py
from rest_framework import serializers
from app import models class AuthorDetailJson(serializers.ModelSerializer):
class Meta:
model = models.AuthorDetail
fields = '__all__' class AuthorJson(serializers.ModelSerializer):
class Meta:
model = models.Author
fields = '__all__' class BookJson(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
# urls.py
from app import views
urlpatterns = [
url(r'^books/', views.Books.as_view()),
url(r'^book/(?P<pk>\d+)/', views.Book.as_view()),
]

数据准备

五大接口

from rest_framework.views import APIView
from rest_framework.response import Response
from app import models, objectjson class Books(APIView):
# 请求地址:/books/
def get(self, request, *args, **kwargs):
book_list = models.Book.objects.all()
book_data = objectjson.BookJson(book_list, many=True).data
return Response({
'status': 0,
'message': 'ok',
'results': book_data
}) # 请求地址:/books/ 参数::{"name": "红楼梦","price": "66.66","author": [1]}
def post(self, request, *args, **kwargs):
book_json = objectjson.BookJson(data=request.data)
if book_json.is_valid():
book_json.save()
return Response({
'status': 0,
'message': 'ok',
'results': book_json.data
}) class Book(APIView):
# 请求地址:/book/1/
def get(self, request, pk, *args, **kwargs):
book = models.Book.objects.filter(pk=pk).first()
book_data = objectjson.BookJson(book).data
return Response({
'status': 0,
'message': 'ok',
'results': book_data
}) # 请求地址:/book/2/ 参数:{"name": "红楼梦","price": "88.88","author": [1]}
def put(self, request, pk, *args, **kwargs):
book = models.Book.objects.filter(pk=pk).first()
book_json = objectjson.BookJson(data=request.data, instance=book)
if book_json.is_valid():
book_json.save()
return Response({
'status': 0,
'message': 'ok',
'results': book_json.data
})
return Response({
'status': 0,
'message': book_json.errors,
}) # 请求地址:/book/2/
def delete(self, request, pk, *args, **kwargs):
deleted, _ = models.Book.objects.filter(pk=pk).delete()
if deleted != 0:
return Response({
'status': 2,
'message': 'delete success'
})
return Response({
'status': 1,
'message': 'delete failed'
})

五大接口

五大接口的基础整合:过渡

# views.py
from rest_framework.viewsets import ModelViewSet
from app import models, objectjson class Books(ModelViewSet):
queryset = models.Book.objects
serializer_class = objectjson.BookJson class Book(ModelViewSet):
queryset = models.Book.objects
serializer_class = objectjson.BookJson
lookup_field = 'pk'
# urls.py
from app import views urlpatterns = [
url(r'^books', views.Books.as_view({'get': 'list', 'post': 'create'})),
url(r'^book/(?P<pk>\d+)/', views.Book.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
# 解读
'''
ModelViewSet继承:五大接口的Mixin,GenericViewSet
--五大接口的Mixin:
-- 分别提供 get_list(list) | post_one(create) | get_one(retrieve) | put_one(update) | delete_one(destroy)
-- GenericViewSet:
-- 继承:ViewSetMixin, generics.GenericAPIView
-- ViewSetMixin:重写as_view():解析路由 as_view({'get':'list','post':'create'})
-- GenericAPIView:提供基础的 APIView,拥有请求方式
'''

过渡

项目开发基于drf的cbv设计:重点

视图模块

# views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from app import models, objectjson # 可以将于Book有关的所有操作函数都放在该CBV中,任何在路由层完成as_view("请求方式":"处理方法")分发
class BookView(ModelViewSet):
# 如果需要使用基础(没有任何业务逻辑)的五大接口
queryset = models.Book.objects
serializer_class = objectjson.BookJson
lookup_field = 'pk' # 有名分组key # 世纪开发的业务逻辑远远超出五大接口的基础逻辑范围
# 自定义n个处理数据的函数
def get_book_by_id(self, request, id, *args, **kwargs):
book = models.Book.objects.filter(pk=id).first()
book_data = objectjson.BookJson(book).data
return Response({
'status': 0,
'message': 'ok',
'results': book_data
})
# urls.py
urlpatterns = [
url(r'^book/(?P<id>\d+)/', views.BookView.as_view({'get': 'get_book_by_id'})),

路由模块

from app import views
urlpatterns = [
# 传统CBV
url(r'^books/',views.Books.as_view()),
]
urlpatterns = [
# CBV路由的函数分发
url(r'^books/',views.BookView.as_view({"get":"get_list"})),
]

解析模块

# views.py
# 解析模块:form-data(MultiPartParser) from-urlencoded(FormParser) json(JSONParser)
from rest_framework.viewsets import ModelViewSet
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from rest_framework.response import Response
class TestParser(ModelViewSet):
# 插拔式:选择性定制解析
# 配置用户不同方式提交数据,服务器能否提供解析
parser_classes = [MultiPartParser, FormParser, JSONParser] # 局部配置即parser_classes=[]在列表中填哪个这个类就解析什么
def post(self, request, *args, **kwargs):
return Response({
'status': 0,
'message': 'TestParser',
'results': request.data
})
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
)
}
# 注释哪个就在全局不使用哪个上传数据的格式
# urls.py
urlpatterns = [
url(r'^parsers/', views.TestParser.as_view({'post': 'post'})),
]

响应模块

# views.py
# 相应模块
from rest_framework.viewsets import ModelViewSet
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
from rest_framework.response import Response
class TestParser(ModelViewSet):
# 插拔式:选择性定制相应模块
# 配置服务器提供的不同相应数据的方式
# renderer_classes = [JSONRenderer]# 局部配置需要哪个写哪个
def get(self, request, *args, **kwargs):
return Response({
'status': 0,
'message': 'TestParser'
})
# settings.py
# 全局配置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
# 'rest_framework.renderers.BrowsableAPIRenderer',
)
}
# 当别人在浏览器中访问你的路由,会知道你用了drf模块,在实际开发中一般禁用BrowsableAPIRenderer。
# urls.py
urlpatterns = [
url(r'^parsers/', views.TestParser.as_view({'get': 'get'})),
]

版本控制模块

基本配置

REST_FRAMEWORK = {
# 默认版本
'DEFAULT_VERSION': 'v1',
# 现存版本
'ALLOWED_VERSIONS': ['v1', 'v2'],
# url的参数key
'VERSION_PARAM': 'version',
}

通过请求参数完成版本配置

# api.site.com/versioning/?version=v1 | api.site.com/versioning/?version=v2
# -- QueryParameterVersioning
# -- url(r'^versioning/',views.TestVersioning.as_view({'get':'get'}))
# -- 请求:/versioning/?version=v1 | /versioning/?version=v1
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioning
class TestVersioning(ModelViewSet):
versioning_class = QueryParameterVersioning def get(self, request, *args, **kwargs):
print(request.version)
print(request.versioning_scheme)
if request.version == 'v1':
print('v1版本的业务逻辑')
elif request.version == 'v2':
print('v2版本的业务逻辑')
return Response({
'status': 0,
'message': 'TestVersioning',
'version': request.version
})

通过请求url完成版本配置:常用

# api.site.com/v1/versioning/ | api.site.com/v2/versioning/
# -- URLPathVersioning
# -- url(r'^(?P<version>(v1|v2))/versioning/', views.TestVersioning.as_view({'get': 'get'})),
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework.versioning import URLPathVersioning class TestVersioning(ModelViewSet):
versioning_class = URLPathVersioning def get(self, request, *args, **kwargs):
print(request.version)
print(request.versioning_scheme)
if request.version == 'v1':
print('v1版本的业务逻辑')
elif request.version == 'v2':
print('v2版本的业务逻辑')
return Response({
'status': 0,
'message': 'TestVersioning',
'version': request.version
})

rest_framework五大模块的更多相关文章

  1. Linux内核的五大模块

    Linux内核的五大模块 (转自)https://blog.csdn.net/huangjingbin/article/details/19396235 Linux内核的五大模块 1.进程调度模块 2 ...

  2. DRF的封装:APIView类及五大模块

    目录 一.drf框架的封装特点 1.APIView类 二.drf的基础组件 1.请求模块 1.1 请求模块做了什么 1.2 请求request参数 2.解析模块 3.响应模块 4.渲染模块(了解) 5 ...

  3. QtCore是Qt的精髓(包括五大模块:元对象系统,属性系统,对象模型,对象树,信号槽)

    作者:小豆君的干货铺链接:https://www.zhihu.com/question/27040542/answer/218384474来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  4. python3 爬虫五大模块之三:网页下载器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  5. python3 爬虫五大模块之二:URL管理器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  6. python3 爬虫五大模块之一:爬虫调度器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  7. python3 爬虫五大模块之五:信息采集器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  8. python3 爬虫五大模块之四:网页解析器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  9. 微信CRM六大模块的详解

    微信团队一直强调企业微信的主要功能是服务而非营销工具,微信5.0将公众号区分为服务号和订阅号,10月底平台为服务号开放高级接口,包括客服接口.网页授权等,可见服务是微信公众号的核心价值和方向.前一阵很 ...

随机推荐

  1. 大数据理论篇HDFS的基石——Google File System

    Google File System 但凡是要开始讲大数据的,都绕不开最初的Google三驾马车:Google File System(GFS), MapReduce,BigTable. 为这一切的基 ...

  2. Alpha阶段项目复审(鸽牌开发小分队)

    团队:鸽牌开发专业小分队 项目:必备记 集合帖:集合帖 项目复审: 团队名字 项目链接 优点 缺点和bug报告 最终名次 歪瑞古德小队 海岛漂流 1.功能齐全,上手简单2.界面简洁美观3.想法新颖,可 ...

  3. HM16.0之帧内模式——xCheckRDCostIntra()函数

    参考:https://blog.csdn.net/nb_vol_1/article/category/6179825/1? 1.源代码: Void TEncCu::xCheckRDCostIntra( ...

  4. Java多线程_Semaphore信号量

    概念: Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.当Semaphore的个数变成1时,即代表只允许 ...

  5. Java面试题(Kafka篇+zookeeper 篇)

    Kafka 152.kafka 可以脱离 zookeeper 单独使用吗?为什么? kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafk ...

  6. [状压DP]P1441 题解 砝码称重

    前置知识:状压DP 洛谷传送门 emm....看到题目,我第一个想到的就是枚举.暴力大法好! 具体怎么枚举?当然是子集枚举啦!枚举出每一个可能的砝码选择方案.对于每一个合法的(也就是选取数量等于\(n ...

  7. 阿里大牛教你基于Python的 Selenium自动化测试示例解析

    今天给大家讲解的是自动化测试示例的解析,如有不对的地方请多多指教. 自动化测试示例如下: from selenium import webdriver from selenium.webdriver. ...

  8. nginx配置过程中出现的问题

    在安装nginx时我们先创建用户useradd -s /sbin/nologin -M nginx 不然会报nginx: [emerg] getpwnam("nginx") fai ...

  9. 万字长文,一篇文章带你入门Python

    注释 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提供 ...

  10. 我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传. 而第三方接口返回的数据是 JSON 格式的,其中 ...