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',
        ),
    
  • 相关阅读:
    linux tmux基本操作
    AJAX json集合传入Controller后台
    python 数据读取
    appium
    接口测试设计思路
    python 常用模块
    接口测试程序部分
    测试用例设计思路
    mock_待续
    网站收藏
  • 原文地址:https://www.cnblogs.com/russellyoung/p/Restful-API-xue-xiDay5--DRF-zhi-xian-zhi-fen-ye-ji.html
Copyright © 2011-2022 走看看