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. 使用 Xunit.DependencyInjection 改造测试项目

    使用 Xunit.DependencyInjection 改造测试项目 Intro 这篇文章拖了很长时间没写,之前也有介绍过 Xunit.DependencyInjection 这个项目,这个项目是由 ...

  2. 毕业一年后接私活赚了10w,还拿了几家大厂offer!

    原本计划这周接着写一篇技术文章的,但是没想到忙到天天凌晨回家,几乎没有为下一篇文章做准备的时间(通常写一篇文章需要至少 30 个小时,需要搭进日常下班及周末的休息时间).这周如果写的话精力和时间都达不 ...

  3. kali中PHANTOM-EVASION 3.0运行时module ' OpenSSL.crypto' has no attribute ' PKCS12Type'报错解决方法

    kali中直接用pip install pyopenssl安装当最新的openssl中的crypto中的类PKCS12Type改成了PKCS12 所以需要在phantom中改对应代码 将这个文件中对应 ...

  4. tp3.2关闭debug save方法执行失败

    解决该问题需要 清除缓存文件 将retime下的文件删除

  5. UNION 和 UNION ALL的区别,一个例子就看明白

    [UNION ALL] select a,b,sum(sm) AS s1, SUM(qm) AS s2 from ( select 'a' AS a, 'b' AS b, 2 AS sm, 200 A ...

  6. ceph在centos7下一个不容易发现的改变

    在centos6以及以前的osd版本,在启动osd的时候,回去根据ceph.conf的配置文件进行挂载osd,然后进行进程的启动,这个格式是这样的 [osd.0] host = hostname de ...

  7. centos搭建dns服务

    原文:(https://www.myjinji.top/articles/2020/04/02/1585800289945.html)[https://www.myjinji.top/articles ...

  8. Weblogic CVE-2020-2551漏洞复现&CS实战利用

    Weblogic CVE-2020-2551漏洞复现 Weblogic IIOP 反序列化 漏洞原理 https://www.anquanke.com/post/id/199227#h3-7 http ...

  9. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  10. 深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?

    SpringBoot异常处理 简介 ​ 日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用try ,catch的方式处理异常或者throw,throws的方式抛出异常不管.这种 ...