python全栈开发day102-django rest-framework框架
1.频次访问组件
1) 手写版本
# class VisitThrottle(BaseThrottle):
#
# def __init__(self):
# self.history = None
#
# def allow_request(self, request, view):
# """
# 限制IP每分钟访问不能超过3次
# :param request:
# :param view:
# :return:
# """
#
# # 确定访问IP
# print(self.get_ident(request))
# remote_addr = request.META.get('REMOTE_ADDR')
# print("REMOTE_ADDR", remote_addr)
#
# # 获取当次访问时间
# ctime = time.time()
#
# # if 第一次访问
# if remote_addr not in VISIT_RECORD:
# VISIT_RECORD[remote_addr] = [ctime, ]
# return True
#
# history = VISIT_RECORD.get(remote_addr)
# self.history = history
#
# while history and ctime - history[-1] > 60:
# history.pop()
#
# if len(history) < 3:
# history.insert(0, ctime)
# return True
# else:
# return False
#
# def wait(self):
# # 当前访问时间
# ctime = time.time()
#
# # 访问时间历史记录 self.history
#
# return 60 - (ctime - self.history[-1])
频率访问组件
2)rest-framework自带的简单组件
from rest_framework.throttling import SimpleRateThrottle class VisitedThrottle(SimpleRateThrottle):
scope = 'visited_rate'
THROTTLE_RATES = {'visited_rate': '3/m'} def get_cache_key(self, request, view):
return self.get_ident(request) # 写在全局
settings.py
"DEFAULT_THROTTLE_CLASSES": ("app01.utils.throttle_class.VisitThrottle",),
"DEFAULT_THROTTLE_RATES": {
"visit_rate": "10/m",
},
simpleRateThrottle
2.URL解析器
用法:

产生4条url:

支持.json等格式访问:

3.分页
# 定义分页组件类
class MyPageNumberPagination(PageNumberPagination):
page_size = 2
page_query_param = 'p'
page_size_query_param = 'size'
max_page_size = 3 class BookView(APIView):
# parser_classes = [FormParser, JSONParser, MultiPartParser] def get(self, request):
book_list = Book.objects.all().order_by('pk')
mypagination = MyPageNumberPagination() # 分页
pagination_list = mypagination.paginate_queryset(book_list, request) # 分页
bs = BookSerializer(pagination_list, many=True)
return response.Response(bs.data) class PublishView(ModelViewSet):
authentication_classes = [UserAuth, ]
# throttle_classes = [UserThrottle, ] permission_classes = [UserPermission, ]
queryset = Publish.objects.all().order_by('pk') #分页
serializer_class = PublishSerializer
pagination_class = MyPageNumberPagination # 分页
4.响应器
REST_FRAMEWORK={
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'app01.utils.auth_class.UserAuth',
),
'DEFAULT_PERMISSION_CLASSES': (
'app01.utils.permission_class.SVIPPermission',
),
"DEFAULT_THROTTLE_CLASSES": ("app01.utils.throttle_class.VisitThrottle",),
"DEFAULT_THROTTLE_RATES": {
"visit_rate": "10/m",
},
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
#'rest_framework.renderers.BrowsableAPIRenderer',
),
# "PAGE_SIZE":3
}
5. 重写serialiazer中的create方法,解决配置列的报错问题read_only或write_only
class BookSerializer(serializers.ModelSerializer):
publish_name=serializers.CharField(max_length=32,source="publish.name",read_only=True)
# publish_pk=serializers.CharField(max_length=32,source="publish.pk",read_only=True)
# 该字段get的时候显示,post的时候不会写入create方法
publish_info=serializers.SerializerMethodField(read_only=True)
authors_list=serializers.SerializerMethodField(read_only=True)
def get_authors_list(self,obj):
ret=[]
for i in obj.authors.all():
ret.append({"name":i.name,"pk":i.pk})
return ret
def get_publish_info(self,obj):
return {"name":obj.publish.name,"publish_pk":obj.publish.pk}
def create(self, validated_data):pass
class Meta:
model = Book
# fields=["title","price"]
fields = "__all__"
# 设置字段get的时候不显示,post的时候会写入create方法
extra_kwargs={"publish":{"write_only":True},"authors":{"write_only":True}}
重写write:
BookSerializer
class BookSerializer(serializers.ModelSerializer):
publish_info = serializers.SerializerMethodField(read_only=False)
authors_info = serializers.SerializerMethodField(read_only=False) def get_authors_info(self, obj):
temp = []
for i in obj.authors.all():
temp.append({
"author_pk": i.pk,
"author_name": i.name,
"author_email": i.email
})
return temp def get_publish_info(self, obj):
return {"publish_pk": obj.publish.pk,
"publish_name": obj.publish.name,
"publish_addr": obj.publish.address} class Meta:
model = Book
fields = "__all__"
# exclude = ["publish"]
extra_kwargs = {
"publish": {"read_only": True},
"authors": {"read_only": True}
} def create(self, validated_data):
my_validated_data = validated_data['owner'] authors_info = my_validated_data.pop('authors_info')
publish_info = my_validated_data.pop('publish_info')
my_validated_data['publish_id'] = publish_info.get('publish_pk')
authors_pk_list = []
for i in authors_info:
authors_pk_list.append(i.get('author_pk'))
self.instance = Book.objects.create(**my_validated_data)
self.instance.authors.set(authors_pk_list)
return self.instance
类BookSerializer
BookView /重点.要将非model中的字段通过save(owner=request.data传给validated_data)
class BookView(APIView):
# parser_classes = [FormParser, JSONParser, MultiPartParser] def get(self, request):
book_list = Book.objects.all().order_by('pk')
mypagination = MyPageNumberPagination()
pagination_list = mypagination.paginate_queryset(book_list, request)
bs = BookSerializer(pagination_list, many=True)
return response.Response(bs.data) def post(self, request):
serializer = BookSerializer(data=request.data) if serializer.is_valid(): serializer.save(owner=request.data)
# print(serializer.data) # 必须在save()方法之后
# {'id': 8, 'title': '第10本书', 'price': 12, 'publish': 1, 'authors': [1, 3]}
print(serializer.validated_data)
# OrderedDict([('title', '第10本书'), ('price', 12), ('publish', < Publish: 沙河出版社 >),
# ('authors', [ < Author: 下马哥 >, < Author: eva >])])
return response.Response(serializer.data)
else:
return response.Response(serializer.errors)
类BookView
https://www.cnblogs.com/yuanchenqi/articles/8719520.html
python全栈开发day102-django rest-framework框架的更多相关文章
- Python全栈开发:django网络框架(二)
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- Python全栈开发:django网络框架(一)
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- 巨蟒python全栈开发数据库前端8:jQuery框架2
数据可视化推荐网站(都是JavaScript写的): echart网站: https://echarts.baidu.com/ 聚宽网站: https://www.joinquant.com/ 我们要 ...
- 巨蟒python全栈开发数据库前端7:jQuery框架
每个人的标准不同,看法等等,认识,价值观有所不同,促成了这些矛盾. 1.select例子 <!DOCTYPE html> <html lang="en"> ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- python全栈开发目录
python全栈开发目录 Linux系列 python基础 前端~HTML~CSS~JavaScript~JQuery~Vue web框架们~Django~Flask~Tornado 数据库们~MyS ...
- Python全栈开发相关课程
Python全栈开发 Python入门 Python安装 Pycharm安装.激活.使用 Python基础 Python语法 Python数据类型 Python进阶 面向对象 网络编程 并发编程 数据 ...
- Python 全栈开发【第0篇】:目录
Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
随机推荐
- 数据分析之Pandas
一.Pandas介绍 1.介绍 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. ...
- Luogu P3600 随机数生成器(期望+dp)
题意 有一个长度为 \(n\) 的整数列 \(a_1, a_2, \cdots, a_n\) ,每个元素在 \([1, x]\) 中的整数中均匀随机生成. 有 \(q\) 个询问,第 \(i\) 个询 ...
- Python【第五篇】模块、包、常用模块
一.模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
- A.01.12—模块的输出—通讯(CAN&LIN)
AN和LIN相关的内容很多,今天仅对几年前困扰过我的一个疑问进行说明. 以前最常见的通迅方式为CAN和LIN,但现在也有很多其他的通讯方式了,而这两种通讯方式仍使用广泛. 前几年常听人说CAN的成本和 ...
- secureCRT自动断开的解决方法
转: secureCRT自动断开的解决方法 secureCRT自动断开的解决方法 在secureCRT上登录时,一段时间不用的话会自动断开,必须重新连接,有点麻烦. 有时候服务器端的 /etc/pro ...
- 2019南昌邀请赛网络预选赛 I. Max answer(单调栈+暴力??)
传送门 题意: 给你你一序列 a,共 n 个元素,求最大的F(l,r): F(l,r) = (a[l]+a[l+1]+.....+a[r])*min(l,r); ([l,r]的区间和*区间最小值,F( ...
- 解决CentOS出现"No package redis available"提示问题
[root@bogon src]# yum install redis Loaded plugins: fastestmirror, langpacks Repository base is list ...
- 图解 CMS 垃圾回收机制原理,-阿里面试题
最近在整理JVM相关的PPT,把CMS算法又过了一遍,每次阅读源码都能多了解一点,继续坚持. 什么是CMS CMS全称 ConcurrentMarkSweep,是一款并发的.使用标记-清除算法的垃圾回 ...
- 盒子显隐,伪类边框,盒子阴影,2d平面形变
-盒子显隐 显隐的盒子尽量不影响其他盒子的布局 display:none; 消失的时候不占位置,显示的时候占位 opacity:0-1; 盒子透明度 overflow: hidden; 超出部分隐藏 ...
- 使用ArcMap做一个1:5000标准分幅图并编号
实现这个project,十进制度.渔网工具.Excel if/Text函数.挂接Excel表.空间连接.投影这些知识是必须的.看懂本篇博文也就意味着大概掌握了以上知识. 坐标数据设置与编号标准依据&l ...