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的更多相关文章

  1. Python之Django rest_Framework框架源码分析

    #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ...

  2. django rest_framework 框架的使用

    django 的中间件 csrf Require a present and correct csrfmiddlewaretoken for POST requests that have a CSR ...

  3. django rest_framework 框架的使用03

    rest_framework的 数据解析器 首先需要知道前端发给后端的数据格式头有哪些: media_type = 'application/json' media_type = 'applicati ...

  4. Django rest_framework 实用技巧

    前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...

  5. Python之Django rest_Framework(2)

    实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ...

  6. python之Django rest_framework总结

    一.rest api    a.api就是接口         如: - http://www.oldboyedu.com/get_user/                - http://www. ...

  7. rest_framework框架下的Django声明和生命周期

    rest_framework框架下的Django声明和生命周期 Django声明周期(request) 客户端发起请求 请求经过wsgi wsgi: 是一个协议----web服务网关接口,即在web服 ...

  8. Python之Django rest_Framework(3)

    补充:  为什么要前后端分离:       a.因为前端它有自己框架,这样它的效率就非常高       b.不做前后端分离,公司如果既有客户端,又有app这种情况下你就的写两遍 django rest ...

  9. rest_framework框架

    rest_framework框架的认识 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一  路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 ...

随机推荐

  1. python yaml文件读写

    import yaml yaml_dict={"} with open("a.yaml", "w") as f: yaml.safe_dump(yam ...

  2. 解决Error: ENOENT: no such file or directory, scandir 安装node-sass报错

    新项目开发需要安装依赖,但是安装完之后通过gulp运行项目,产生了一下的报错: 解决方案是执行一些方法: npm rebuild node-sass 可是有时就是网络问题导致上面命令安装失败,查下失败 ...

  3. vue2.0 组件和v-model

    本文适合初学组件编写的同学阅读. 乍一看这个标题,可能会有疑问:v-model和组件也能扯到一起? 我打算写这篇文章的时候,也是这么想的.咱们按简历的那一套STAR法则来梳理一下这篇文章: 情景[Si ...

  4. 导出csv文件,导出axlsx文件。gem 'Axlsx-Rails' (470🌟);导入csv文件。

    汇出 CSV 档案 需求:后台可以汇出报名资料 有时候后台功能做再多,也不如 Microsoft Excel 或 Apple Numbers 试算表软件提供的分析功能,这时候如果有汇出功能,就可以很方 ...

  5. 13个能快速开发android的经典项目

    一.okhttp一个让网络请求更简单的框架 项目地址 https://github.com/jeasonlzy/okhttp-OkGo 二. TwinklingRefreshLayout-下拉刷新和上 ...

  6. Confluence 6 创建一个用户宏

    如果你想创建自定义的宏的话,用户宏能够帮你完成这个任务.这个可以在你系统中应用特定的操作,比如说应用自定义格式等. 用户用是在 Confluence 创建和和管理的,你需要有一定的编码基础才可以. 你 ...

  7. this 知多少

    js 中的this 到底指向哪里涅,学习js的过程中,肯定有不少小伙伴们调入this的大坑中,究其原因,this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁...曾经,我 ...

  8. python学习笔记(六)---sublime text3 创建python项目

    1.创建项目 依次鼠标左键点击Project>Add Folder to Project...,选择test文件夹: 2.保存项目 依次鼠标左键点击Project>Save Project ...

  9. linux下informatica服务安装和配置

    本文中将会用infa简称代替informatica 1.安装前准备 介质名称 版本信息 描述 Informatica Powercenter 9.5.1 for Linux 64 bit 必须 Jav ...

  10. c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库

    ///c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库 闲话不多说,直接上代码 using System; using System.Collectio ...