zoukankan      html  css  js  c++  java
  • 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',
        ),
    
  • 相关阅读:
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 454 四数相加 II
    Java实现 LeetCode 454 四数相加 II
    Java实现 LeetCode 454 四数相加 II
    FFmpeg解码H264及swscale缩放详解
    linux中cat more less head tail 命令区别
    C语言字符串操作总结大全(超详细)
    如何使用eclipse进行嵌入式Linux的开发
  • 原文地址:https://www.cnblogs.com/russellyoung/p/Restful-API-xue-xiDay5--DRF-zhi-xian-zhi-fen-ye-ji.html
Copyright © 2011-2022 走看看