django rest_framework 框架的使用02
rest_framework 访问频率的限制(节流)
对于用户访问频率的显示,rest_framework 也有自己的类进行约束
- 先来一个自己的基于它的类的节流类的限制
class VisitControl(BaseThrottle):
"""
访问评论限制
"""
def __init__(self):
self.history = None
def allow_request(self, request, view):
ctime = time.time()
remote_addr = self.get_ident(request)
if remote_addr not in VISIT_DICT:
VISIT_DICT[remote_addr] = [ctime, ]
return True
history_list = VISIT_DICT.get(remote_addr)
self.history = history_list
"""
history_list[-1] < ctime - 10
这个--> 如果当前的时间 减去 60秒 之后 与列表里面的 最后一个 就是最早访问的 时间 比较
如果 比他大 证明 这个 时间 无效了 ,把他 去除 ,然后在比较前一个 直到
当前时间 减去60秒之后 比 最后一个小, 证明 这个时间在60秒内,第一个条件就符合了
然后 剩下的 列表里面的值就都符合了(因为 列表里面最前面的元素 时间约靠近当下时间)
然后拿着这个列表里面的值 去判断 (因为这些值都是 60 秒内访问的) 如果小于3 证明 你还有一次机会
让他访问 ,但是 需要 把他加到 列表里面去,
以便下次判断列表个数的时候使用(每次符合要求的时间都需要加到列表里面,共后续使用)
"""
while history_list and history_list[-1] < ctime - 10:
history_list.pop()
if len(history_list) < 3:
history_list.insert(0, ctime)
return True
def wait(self):
ctime = time.time()
return 60 - (ctime - self.history[-1])
其实rest_framework已经为我们提供了基于用户的节流类,以及基于IP的节流类,我们只需要继承这个两个类 分别实现各自的方法即可:
class UserThrottle(SimpleRateThrottle):
scope = "User" # 登录用户访问频率的限制
def get_cache_key(self, request, view):
return request.user.username
class IpThrottle(SimpleRateThrottle):
scope = "AsyUser" # 匿名用户访问频率的限制
def get_cache_key(self, request, view):
return self.get_ident(request)
"""
注意的是全局的settings配置如下
"""
"DEFAULT_AUTHENTICATION_CLASSES": ["api.utils.permission.MyAuthtication",], # 认证全局配置
"DEFAULT_PERMISSION_CLASSES": [], # 权限的 全局配置
# 节流的频率控制
"DEFAULT_THROTTLE_RATES": {
"Luffy": "10/m",
"User": "20/m"
},
# 节流的类,默认是没有的!
"DEFAULT_THROTTLE_CLASSES": ["api.utils.permission.UserThrottle",]
rest_framework版本控制
首先是自己写在url的get请求的版本控制比如
url="xxxxxx/?version=v1"
对应的类方法如下:
class MyVersion(BaseVersioning):
"""
自己 的类的方法
"""
def determine_version(self, request, *args, **kwargs):
version = request.query_params.get("version")
return version
看一下其他部分的源码:
## 版本的控制的
## version 是版本号,这个scheme 是你的解析版本的类
## 解析版本的类只允许有一个
version, scheme = self.determine_version(request, *args, **kwargs)
# 版本赋值给 request.version 类赋值给request.versioning_scheme
request.version, request.versioning_scheme = version, scheme
一般使用这个内之类即可
from rest_framework.versioning import URLPathVersioning
class URLPathVersioning(BaseVersioning):
"""
To the client this is the same style as `NamespaceVersioning`.
The difference is in the backend - this implementation uses
Django's URL keyword arguments to determine the version.
An example URL conf for two views that accept two different versions.
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
]
GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
"""
invalid_version_message = _('Invalid version in URL path.')
def determine_version(self, request, *args, **kwargs):
version = kwargs.get(self.version_param, self.default_version)
if not self.is_allowed_version(version):
raise exceptions.NotFound(self.invalid_version_message)
return version
def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
if request.version is not None:
kwargs = {} if (kwargs is None) else kwargs
kwargs[self.version_param] = request.version
return super(URLPathVersioning, self).reverse(
viewname, args, kwargs, request, format, **extra
)
django rest_framework 框架的使用02的更多相关文章
- Python之Django rest_Framework框架源码分析
#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ...
- django rest_framework 框架的使用
django 的中间件 csrf Require a present and correct csrfmiddlewaretoken for POST requests that have a CSR ...
- django rest_framework 框架的使用03
rest_framework的 数据解析器 首先需要知道前端发给后端的数据格式头有哪些: media_type = 'application/json' media_type = 'applicati ...
- Django rest_framework 实用技巧
前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...
- Python之Django rest_Framework(2)
实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ...
- python之Django rest_framework总结
一.rest api a.api就是接口 如: - http://www.oldboyedu.com/get_user/ - http://www. ...
- rest_framework框架下的Django声明和生命周期
rest_framework框架下的Django声明和生命周期 Django声明周期(request) 客户端发起请求 请求经过wsgi wsgi: 是一个协议----web服务网关接口,即在web服 ...
- Python之Django rest_Framework(3)
补充: 为什么要前后端分离: a.因为前端它有自己框架,这样它的效率就非常高 b.不做前后端分离,公司如果既有客户端,又有app这种情况下你就的写两遍 django rest ...
- rest_framework框架
rest_framework框架的认识 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一 路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 ...
随机推荐
- 安装基础版的kinetic
没有gui工具 sudo apt-get install ros-kinetic-ros-base
- Docker简单部署Ceph测试集群
通过docker可以快速部署小规模Ceph集群的流程,可用于开发测试. 以下的安装流程是通过linux shell来执行的;假设你只有一台机器,装了linux(如Ubuntu)系统和docker环境, ...
- lua劈分字符串方法及实例
由于工作项目需要,最近需要用lua来写一些脚本.然而lua并不想java那样有很多的好用的api,很多方法得我们自己来编写和封装,就比如今天碰到的劈分字符串,查找资料后只能自己写了一个. 代码如下 - ...
- Java Redis的Pipeline管道,批量操作,节省大量网络往返时间 & Redis批量读写(hmset&hgetall) 使用Pipeline
一般情况下,大家使用redis去put/get都是先拿到一个jedis实例,然后操作,然后释放连接:这种模式是 请求-响应,请求-响应 这种模式,下一次请求必须得等第一次请求响应回来之后才可以,因为r ...
- EF大数据批量添加性能问题(续)
昨天在园子里发了一篇如题的文章EF大数据批量添加性能问题,就引来一大堆的吐槽,我认为知识就应该这样分享出来,不然总以为自己很了不起:再说说昨天那篇文章,很多自认为很牛逼的人都评论说把SaveChang ...
- PHP------数组和对象相互转化,stdClass Object转array
数组转JSON PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE . JSON转数组 PHP json_decode() ...
- 安装GraphicsMagick
环境 CentOS7/CentOS7.1 x64 1.检查yum 2.检查是否安装zlib,下载地址:http://www.zlib.net/ 3.安装libpng,下载地址:http://www. ...
- get方法传送中文乱码解决方法
找到tomcat配置文件 server.xml 找到<Connector port="8080" ....... /> (......为配置文件中原来内容) 在最 ...
- halcon之屌炸天的自标定(1)
本次先对halcon的自标定做个整体介绍,了解屌炸天的自标定在实际应用中的应用与实现方法,具体的编程细节将在后续的文章中介绍. halcon提供了一种自标定的算子,它可以在不用标定板的情况下,标定 ...
- python-基础-时间日期处理小结(datetime模块)
在写代码的时候,总是会遇到各式各样关于时间的处理和要求.总结一下: 首先,本文是关于datetime模块的各种总结. 开始. 一.datetime基本操作 1.获取当前datetime time = ...