1.DRF初始化

1.认证

2.权限

3.限流

4.序列化

5.分页

6.版本 

7.过滤

8.排序

1.1安装DjangoRestFramework

pip install djangoresframework==3.11.1

pip install django-filter==2.3.0   #过滤器

pip install markdown     #Markdown support for the browsable API

1.2在syl/settings.py中注册

INSTALLED_APPS=[

  'django_filters',

  'rest_fromework'

]

# 过滤器

# 1,安装 django-filter

# 2,注册应用

# 3,配置settings, 在view里配置可过滤的字段

# 4,使用 查询字符串携带过滤信息

REST_FRAMEWORK = {

# 文档报错: AttributeError: ‘AutoSchema’ object has no attribute ‘get_link’

# 用下面的设置可以解决

'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',

# 默认设置是:

# 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.openapi.AutoSchema',

# 异常处理器

# 'EXCEPTION_HANDLER': 'user.utils.exception_handler',

# Base API policies

'DEFAULT_RENDERER_CLASSES': [

'rest_framework.renderers.JSONRenderer',

'rest_framework.renderers.BrowsableAPIRenderer',

],

'DEFAULT_PARSER_CLASSES': [

'rest_framework.parsers.JSONParser',

'rest_framework.parsers.FormParser',

'rest_framework.parsers.MultiPartParser'

],

# 1.认证器(全局)

'DEFAULT_AUTHENTICATION_CLASSES': [

'rest_framework.authentication.SessionAuthentication',  # 使用session时的认证器

'rest_framework.authentication.BasicAuthentication'     # 提交表单时的认证器

],

#2.权限配置(全局): 顺序靠上的严格

'DEFAULT_PERMISSION_CLASSES': [

# 'rest_framework.permissions.IsAdminUser',  # 管理员可以访问

# 'rest_framework.permissions.IsAuthenticated',  # 认证用户可以访问

# 'rest_framework.permissions.IsAuthenticatedOrReadOnly',  # 认证用户可以访问, 否则只能读取

# 'rest_framework.permissions.AllowAny',  # 所有用户都可以访问

],

#3.限流(防爬虫)

'DEFAULT_THROTTLE_CLASSES': [

'rest_framework.throttling.AnonRateThrottle',

'rest_framework.throttling.UserRateThrottle',

],

#3.1限流策略

'DEFAULT_THROTTLE_RATES': {

'user': '100/hour',    # 认证用户每小时100次

'anon': '3/day',       # 未认证用户每天能访问3次

},

'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation',

'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata',

'DEFAULT_VERSIONING_CLASS': None,

#4.分页(全局):全局分页器, 例如 省市区的数据自定义分页器, 不需要分页

'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',

# 每页返回数量

'PAGE_SIZE': 10,  # 默认 None

#5.过滤器后端

'DEFAULT_FILTER_BACKENDS': [

'django_filters.rest_framework.DjangoFilterBackend',

# 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化

],

#5.1过滤排序(全局):Filtering 过滤排序

'SEARCH_PARAM': 'search',

'ORDERING_PARAM': 'ordering',

'NUM_PROXIES': None,

#6.版本控制:Versioning  接口版本控制

'DEFAULT_VERSION': None,

'ALLOWED_VERSIONS': None,

'VERSION_PARAM': 'version',

# Authentication  认证

# 未认证用户使用的用户类型

'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser',

# 未认证用户使用的Token值

'UNAUTHENTICATED_TOKEN': None,

# View configuration

'VIEW_NAME_FUNCTION': 'rest_framework.views.get_view_name',

'VIEW_DESCRIPTION_FUNCTION': 'rest_framework.views.get_view_description',

'NON_FIELD_ERRORS_KEY': 'non_field_errors',

# Testing

'TEST_REQUEST_RENDERER_CLASSES': [

'rest_framework.renderers.MultiPartRenderer',

'rest_framework.renderers.JSONRenderer'

],

'TEST_REQUEST_DEFAULT_FORMAT': 'multipart',

# Hyperlink settings

'URL_FORMAT_OVERRIDE': 'format',

'FORMAT_SUFFIX_KWARG': 'format',

'URL_FIELD_NAME': 'url',

# Encoding

'UNICODE_JSON': True,

'COMPACT_JSON': True,

'STRICT_JSON': True,

'COERCE_DECIMAL_TO_STRING': True,

'UPLOADED_FILES_USE_URL': True,

# Browseable API

'HTML_SELECT_CUTOFF': 1000,

'HTML_SELECT_CUTOFF_TEXT': "More than {count} items...",

# Schemas

'SCHEMA_COERCE_PATH_PK': True,

'SCHEMA_COERCE_METHOD_NAMES': {

'retrieve': 'read',

'destroy': 'delete'

},

}

1.4创建user/serializers.py写序列化器

from rest_framework import serializers

from user.models import User

deef address_validate(data)

#独立校验器

#rase serializers.ValidationError('请填写实际地址')#有错就抛出异常

#没错就返回数据

return data

#没错就返回数据

return data

class UserSerializer(serializers.ModelSerializer):

address=serializers.CharField(max_lenght=5,validators=[address_validate])

#2.单一字段验证,验证地址

def valdate_address(self,data):

  if data=="测试":

      ralsse serializers.ValidationError('请填写实际地址)#有错就抛出异常

  return daata

def validate_phone(self,date):

#不符合手机格式

  model=self.root.Meta.model

  num=model.objects.filter(phone=data).count()  

  if num>0:
    raise serializers.ValidationError('手机号')
    return data
  def validate(self,attrs):
  return attrs
  class Meta:
  model=User
  fields='__all__'
  read_only_fields=('',)
  extra_kwargs={
  "address":{
  "min_length":5,
  "default":"默认测试地址"
   }
}

2.DRFr认证、权限、限流、分页、过滤、序列化、

2.、user/urls.py

from django.http import HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets
from rest_framework.authentication import BaseAuthentication, SessionAuthentication
from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.pagination import PageNumberPagination
from rest_framework.views import APIView
from rest_framework.permissions import BasePermission, SAFE_METHODS
from user.models import User
from user.serializers import UserSerializer

# Create your views here.
def index(request):
return HttpResponse('hello')

class PageNum(PageNumberPagination):
page_size_query_param = 'page_size'
max_page_size = 2

class MyPermission(BasePermission):
def has_permission(self, request, view):
print(view.kwargs.get('pk'), request.user.id)
print(request)
if request.user.is_superuser:
return True
elif view.kwargs.get('pk') == str(request.user.id):
return True
return False

def has_object_permission(self, request, view, obj):
if request.user.id == obj.id:
return True
return False

class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class =UserSerializer
pagination_class = PageNum
thorttle_classes=[UserRateThrottle]
filter_backends = (DjangoFilterBackend, OrderingFilter)
ordering_fields = ('date_joinde', 'id')
filter_fields = ('username', 'phone', 'is_active')

# def get_serializer_class(self):
# if self.action == 'uuactived':
# return UserUnActivSerializer
# else:
# return UserSerializer

  

day1(ModelViewSet序列化限流排序)的更多相关文章

  1. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...

  2. drf 认证、权限、限流、过滤、排序、分页器

    认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...

  3. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  4. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  5. 2. DRF 认证、权限、限流、分页、过滤、序列 化

    2.1 user/urls.py   ModelViewSet注册路由三部曲 from django.urls import include, path from user import views ...

  6. Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流

    1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...

  7. 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单

    不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...

  8. 快速入门系列--WCF--06并发限流、可靠会话和队列服务

    这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的 ...

  9. WCF之并发,吞吐量和限流

    并发 Single重入模式.对于每一个服务实例,同一时刻只能处理一个请求,其他对该实例的请求被排队. PerCall,每一线程会分配一个新的服务实例上.不会有并发性问题.不影响吞吐量. PerSess ...

随机推荐

  1. How to use vscode to build a springboot project

    How to use vscode to build a springboot project 首先截图一个springboot官网的一个教程说明截图.可以根据这里的指南去创建一个HelloWorld ...

  2. js 自适应手机电脑 轮播图

    自己写了一个javascript的可循环轮播图,支持手机滑动,不过代码着实小白,全局变量,函数调用满天飞,研究别的代码规范好的轮播图插件,表示看得懂但是写不出.. HTML: <div id=& ...

  3. python的各版本的不同

    Python的版本主要分为 2.× . 3.× 两个系列. Python3计划每年发布一个新的子版本,一次只增加一两种新语法. 使用时当然选择越新的Python版本越好,版本越老的代码越难维护. 维护 ...

  4. QQ彩贝热销时装

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 弹性盒模型flex-grow的计算

    flex-grow属性是弹性盒布局模块的子属性. 它定义了弹性项目在必要时增长的能力. 它接受作为比例的无单位值. 它决定了项目应在伸缩容器内部占用多少可用空间. 例如,如果所有项目的flex-gro ...

  6. CSS圣杯布局、双飞翼布局详解

    三栏布局中,经典中的经典应该就是圣杯布局.双飞翼布局没跑了.双飞翼布局和圣杯布局其实是一样的,只不过在写法上有些不同,其布局都是左右固定宽度,中间宽度自适应. 先熟悉一下圣杯布局.双飞翼布局中的特点: ...

  7. go-zero 如何扛住流量冲击(一)

    不管是在单体服务中还是在微服务中,开发者为前端提供的API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以 ...

  8. kafka数据一致性(HW只能保证副本之间的数据一致性,并不能保证数据不丢失ack或者不重复。)

    数据一致性问题:消费一致性和存储一致性 例如:一个leader 写入 10条数据,2个follower(都在ISR中),F1.F2都有可能被选为Leader,例如选F2 .后面Leader又活了.可能 ...

  9. Innodb之线程独享内存

    引用链接: https://blog.csdn.net/miyatang/article/details/54881547 https://blog.csdn.net/wyzxg/article/de ...

  10. CentOS GRUB损坏修复方法

    前言 博客很久没有更新了,一个原因就是原来存放部署博客的环境坏了,硬盘使用的是SSD,只要读取到某个文件,整个磁盘就直接识别不到了,还好博客环境之前有做备份,最近一直没有把部署环境做下恢复,今天抽空把 ...