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. 做Java开发7年,今年9个月时间圆梦饿了么P7

    前言 工作拧螺丝,面试造火箭.我想这是每个程序员比较头疼的事情吧!但是,又必须要经历一个面试流程,尤其是摸不清面试官问的问题,导致面试的时候不知道如何回答.本文是工作7年Java程序员从几十次面试中挑 ...

  2. Java_进程与线程

    进Process&Thread 区别 进程 线程 根本区别 作为资源分配的单位 调度和执行的单位 开销 每个进程都有独立的代码和数据空间(进程上下文), 进程间的切换会有较大的开销 线程可以看 ...

  3. 从比心APP源码的成功,分析陪玩系统源码应该如何开发

    提起游戏陪玩系统,相信大家都不陌生.作为一名骨灰级的手游玩家,小编对于陪玩系统源码也有些了解.在互联网络发展愈发迅速的今天,游戏产业在一中领域中脱颖而出,据统计,手机游戏用户已经达到5.29亿,较20 ...

  4. 【SpringBoot】13. logback日志记录

    logback日志记录 Spring Boot 1.5.19.RELEASE 1.导入相关jar包 在spring-boot-starter-web 中已经包含 2.添加logback.xml配置文件 ...

  5. java实现科研信息管理系统

    一.前言 本学期学习了JAVA语言,在学期的结束,写一个有操作界面,与数据库关联的管理系统,用来巩固自己本学习所学的知识.用到的知识:JAVA基础,JAVA界面设计(GUI),Oracle数据库(需要 ...

  6. python中的时间和时间格式转换

    1.python中的时间:要得到年月日时分秒的时间: import time #time.struct_time(tm_year=2012, tm_mon=9, tm_mday=15, tm_hour ...

  7. 性能工具-CPU

  8. Linux mysql 修改密码 三种方式(转载)

    注明:本文为转载,原文地址:https://www.cnblogs.com/chuckjam/archive/2018/08/10/9456255.html 前言 有时我们会忘记Mysql的密码,或者 ...

  9. Git-commit与回滚

    # 提交-信息 git commit -m "message" git commit -a -m "message" // 等同于 git add . & ...

  10. Python_爬虫_基础

    1.urllib 和  Xpath的区别与联系 from urllib import request from lxml import etree from bs4 import BeautifulS ...