Restful API学习Day5

参考文档:
Django REST framework基础:认证、权限、限制
Django REST framework基础:分页
Django REST framework基础:解析器和渲染器

一、限制

比如:限制一个IP每10秒钟只能访问3次(Django中间件 访问频率限制)

visit_record = {
    '127.0.0.1': ['9:56:18', '9:56:17', '9:56:04', '9:56:01']  # 只放最近10秒的请求时间
}

自定义限制类

visit_record = {}


class MyThrottle(object):

    def __init__(self):
        self.history = None

    def allow_request(self, request, view):
        # 拿到当前的请求的ip作为访问记录的 key
        ip = request.META.get('REMOTE_ADDR')
        # 拿到当前请求的时间戳
        now = time.time()
        if ip not in visit_record:
            visit_record[ip] = []
        # 把当前请求的访问记录拿出来保存到一个变量中
        history = visit_record[ip]
        self.history = history
        # 循环访问历史,把超过10秒钟的请求时间去掉
        while history and now - history[-1] > 10:
            history.pop()
        # 此时 history中只保存了最近10秒钟的访问记录
        if len(history) >= 3:
            return False
        else:
            # 判断之前有没有访问记录(第一次来)
            self.history.insert(0, now)
            return True

    def wait(self):
        """告诉客户端还需等待多久"""
        now = time.time()
        return self.history[-1] + 10 - now

如何确定还需要等多久才允许下一次访问:

1547605779765

使用内置的限制类

from rest_framework.throttling import SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):
    scope = "xxx"
    def get_cache_key(self, request, view):
        return self.get_ident(request)

全局注册

1547607416987

二、分页

DRF内置分页器(3种)

页码类型

class MyPageNumber(PageNumberPagination):
    # page_size = 1  # 每页显示多少条
    # page_size_query_param = 'size'  # 每页显示多少条的参数key
    pass

limit&offset型,数据库查询时效率较高!

自定义:

# 当有特殊的配置需要代替默认的配置时,我们就自己写个类
class MyLimitPager(LimitOffsetPagination):
    limit_query_param = 'page_size'  # 自定义limit的参数key
    pass

http://127.0.0.1:8000/publishers/?offset=1&limit=2

加密的分页

用户 让别人看不到具体的页码,页码都是随机字符串

1547610398372

queryset切片之后不能 order_by()

自定制:

class MyCursor(CursorPagination):
    ordering = '-id'
    page_size = 1

三、解析器和渲染器

1547612346631

配置

  # 解析器
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ),

    # 渲染器
    # 你要页面 我就给你页面
    # 你要JSON格式的数据 我就给你JSON格式的数据
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        # 'rest_framework.renderers.BrowsableAPIRenderer',
    ),
原文地址:https://www.cnblogs.com/russellyoung/p/Restful-API-xue-xiDay5--DRF-zhi-xian-zhi-fen-ye-ji.html