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 = {

#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

ModelViewSet里的过滤、排序、分页、序列化设置的更多相关文章

  1. DRF 过滤排序分页异常处理

    DRF 中如何使用过滤,排序,分页,以及报错了如何处理?10分钟get了~

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

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

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

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

  4. DRF之过滤排序分页异常处理

    一.过滤 对于列表数据要通过字段来进行过滤,就需要添加 django-filter 模块 使用方法: # 1.注册,在app中注册 settings.py INSTALLED_APPS = [ 'dj ...

  5. drf07 过滤 排序 分页 异常处理 自动生成接口文档

    4. 过滤Filtering 对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持. pip install django-filter 在配置文件sett ...

  6. Ecside基于数据库的过滤、分页、排序

    首先ecside展现列表.排序.过滤(该三种操作以下简称为 RSF )的实现原理完全和原版EC一样, 如果您对原版EC的retrieveRowsCallback.sortRowsCallback.fi ...

  7. Contoso 大学 - 3 - 排序、过滤及分页

    原文 Contoso 大学 - 3 - 排序.过滤及分页 目录 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 原文地址:http://www.asp.net/mvc/ ...

  8. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  9. jsp+oracle 排序分页+Pageutil类

    1.rownum和排序 Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了. SQL> select rownum ,id,n ...

随机推荐

  1. Docker(5)- docker version 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 显示 Docker 版本信 ...

  2. Java入门(6)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 当方法在子类和超类都定义了时,将使用子类的定义:因此子类可以修改,替换或完全删除超类的行为或属性. 关键字super引用对象的上一级超类, ...

  3. How to: Debug X++ Code Running in .NET Business Connector [AX 2012]

    This topic has not yet been rated - Rate this topic  http://msdn.microsoft.com/EN-US/library/bb19006 ...

  4. 跟我一起学.NetCore之EF Core 实战入门,一看就会

    前言 还记得当初学习数据库操作时,用ADO.NET一步一步地进行数据操作及查询,对于查询到的数据还得对其进行解析,然后封装返回给应用层:遇到这种重复而繁琐的工作,总有一些大神或团队对其进行封装,从而出 ...

  5. Shell 教程01

    Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个 ...

  6. 性能问题,AWR High Event enq: US - contention

    1.1问题现象  应用反馈业务执行SQL响应超时,需要数据库排除DB是否存在问题,创建AWR观察到top event 新增enq: US - contention  ??? 1.2问题分析 1) DB ...

  7. Python之Matplot——01.堆叠柱状图的绘制

    1.Matplotlib是python的一个绘图库,可以方便的绘制各种图标,是数据可视化的利器. 2.本文我就给大家介绍一下条形图或者说柱状图的绘制 3.代码如下: <1>首先导入模块 1 ...

  8. vue-count-to(简单好用的一个数字滚动插件)

    vue-count-to是一个无依赖,轻量级的vue组件,可覆盖easingFn. 1. 你可以设置两个属性startVal和endVal,它会自动判断计数或倒计时.支持vue-ssr.vue-cou ...

  9. dp:322. Coin Change 自下而上的dp

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  10. linux解释器、内建和外建命令

    查看系统是哪种命令解释器: [root@localhost ~]# echo $SHELL /bin/bash 内建命令:是shell程序的一部分,包含的是一些比较简单的linux系统命令,这些命令由 ...