1.DRF框架的8个核心功能
 
  1.认证(用户登录校验用户名密码或者token是否合法)
  2.权限(根据不同的用户角色,可以操作不同的表)
  3.限流(限制接口访问速度)
  4.序列化(返回json)
  5.分页
  6.版本(接口版本号,用 v1/v2/v3)
  # api.example.com/v1/login # 只有用户名密码登录
  # api.example.com/v2/login # 手机号,微信 登录
7.过滤(username=zhangsan)
  8.排序(ordering=-id)
2.相关包
'''1.序列化相关'''
serializer
ModelSerializer
'''2.DRF视图函数继承'''
APIView
ModelViewSet
1.1 安装DjangoRestFramework
pip install djangorestframework==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_framework',
]
1.3 syl/settings.py配置DRF: 全局配置
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'# 提交表单时的认证器
# 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',# 在DRF中配置JWT认证
], # 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': '1000/hour', # 认证用户每小时100次
'anon': '300/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.创建user/serializer.py 文件 用来写序列化

# -*- coding: utf-8 -*-
from rest_framework import serializers
from user.models import User
def address_validate(data):
return data
class UserSerializer(serializers.ModelSerializer):
address=serializers.CharField(max_length=255,min_length=5,validators=[address_validate])
def validate_address(self,data):
if data == "测试":
raise serializers.ValidationError('请填写实际地址')
return data
def validate_phone(self,data):
model=self.root.Meta.model
num=User.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__'
# fields=['username','address']
# exclude=['password']
read_only_fields=('',)
extra_kwargs={
"address":{
"min_length":5,
"default":"默认测试地址"
}
}
class UserInfoSerializer(serializers.Serializer):
id = serializers.CharField(read_only=True)# 普通字段,设置id为只读字段,不能修改
username = serializers.CharField(min_length=3,max_length=20,error_messages= {'required': '该字段必填'})# 显示普通字段
img = serializers.ImageField(required=False)
nick_name = serializers.CharField(max_length=20)
address = serializers.CharField(max_length=255)
xxx = serializers.SerializerMethodField(read_only=True)# 自定义显示(显示多对
class Meta:
model=User
def get_xxx(self,row):
users=row.username
return users
def create(self, validated_data):
return User.objects.create(**validated_data)
def update(self,instance,validated_data):
if validated_data.get('username'):
instance.username = validated_data['username']
instance.save()
return instance
def validate(self,attrs):
print(attrs)
if attrs.get("ussername")=='admin':
raise serializers.ValidationError('不能创建admin用户')
return attrs

class UserUnActiveSerializer(serializers.ModelSerializer):

class Meta:
model=User
fields=('id','username','is_active') #临时添加字段也需要写在这里
#fields="__all__" 所有字段

2.user/view.py 视图编写

from django.http import HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets
from rest_framework.authentication import BasicAuthentication, SessionAuthentication
from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated, IsAuthenticatedOrReadOnly
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 .models import User
from .serializers import UserSerializer, UserUnActiveSerializer
# import markdown

def index(request):
#需要认证才能访问的视图
return HttpResponse('hello')

# 分页(局部):自定义分页器 局部
class PageNum(PageNumberPagination):
# 查询字符串中代表每页返回数据数量的参数名, 默认值: None
page_size_query_param = 'page_size'
# 查询字符串中代表页码的参数名, 有默认值: page
# page_query_param = 'page'
# 一页中多的结果条数
max_page_size = 2

# 自定义权限(局部)
class MyPermission(BasePermission):
# has_permission 是用户对这个视图有没有 GET POST PUT PATCH DELETE 权限的分别判断
def has_permission(self, request, view):
print('has_perm')
# print(view.kwargs.get("pk"), request.user.id)
# """判断用户对模型有没有访问权"""
# 任何用户对使用此权限类的视图都有访问权限
if request.user.is_superuser:
# 管理员对用户模型有访问权
return True
elif view.kwargs.get('pk') == str(request.user.id):
# 携带的id和用户的id相同时有访问权
return True
return False

# has_object_permission 是用户过了 has_permission 判断有权限以后,再判断这个用户有 没有对一个具体的对象有没有操作权限
# 这样设置以后,即使是django admin管理员也只能查询自己user标的信息,不能查询其他用户的 单条信息

def has_object_permission(self, request, view, obj):
print('has_object_perm')
# """获取单个数据时,判断用户对某个数据对象是否有访问权限"""
if request.user.id == obj.id:
return True
return False

class UserViewSet(viewsets.ModelViewSet):
'''
完成产品的增删改查
'''
queryset = User.objects.all()
serializer_class = UserSerializer # 优先使用 get_serializer_class 返回的序列化器

# 1.认证: 自定义认证类, 自定义会覆盖全局配置
authentication_classes = (BasicAuthentication, SessionAuthentication) #
# 2.权限: 自定义权限类
permission_classes = (MyPermission,)

# 3.分页: 自定义分页器 覆盖全局配置
pagination_class = PageNum

# 4.限流: 自定义限流类
throttle_classes = [UserRateThrottle]

# 5.过滤: 指定过滤方法类, 排序方法类, 一个或多个
filter_backends = (DjangoFilterBackend, OrderingFilter) # 同时支持过滤和排序
# 5.1指定排序字段, 不设置, 排序功能不起效
ordering_fields = ('date_joined', 'id') # ?ordering=-id
# 5.2指定过滤字段, 不设置, 过滤功能不起效
filter_fields = ('username', 'phone', 'is_active') # ? username=tom&phone=&is_active=true

# 根据不同的请求, 获得不同的序列化器
def get_serializer_class(self):
if self.action == 'unactived':
return UserUnActiveSerializer
else:
return UserSerializer

@action(methods=['get'], detail=False)
def unactived(self, request, *args, **kwargs):
# 获取查询集, 过滤出未激活的用户
qs = self.queryset.filter(is_active=False)
# 使用序列化器, 序列化查询集, 并且是
ser = self.get_serializer(qs, many=True)
return Response(ser.data)

@action(methods=['get'], detail=False)
def actived(self, request, *args, **kwargs):
# 获取查询集, 过滤出未激活的用户
qs = self.queryset.filter(is_active=True)
# 使用序列化器, 序列化查询集, 并且是
ser = self.get_serializer(qs, many=True)
return Response(ser.data)

3.user/urls.py 路由

from django.urls import path,include
from user import views from rest_framework.routers import SimpleRouter,DefaultRouter from rest_framework.authtoken.views import obtain_auth_token from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token # 自动生成路由器方法,必须使用视图集
router=DefaultRouter()
router.register(r'user',views.UserViewSet) urlpatterns = [
path('index/',views.index),
path('api-auth/',include('rest_framework.urls',namespace='rest_framework')), ] urlpatterns += router.urls # 模块地址

4.查询测试接口

 

1.DRF初始化的更多相关文章

  1. modelviewset与apiview

    modelviewset(认证,权限,限流,序列化,分页,过滤,排序) 1.DRF初始化 1.认证(让用户登录) 2.权限(根据不同用户角色,可以操作不同的表) 3.限流(限制接口访问速度) 4.序列 ...

  2. ModelViewSet里的过滤、排序、分页、序列化设置

    1.DRF初始化 1.认证 2.权限 3.限流 4.序列化 5.分页 6.版本  7.过滤 8.排序 1.1安装DjangoRestFramework pip install djangoresfra ...

  3. day1(ModelViewSet序列化限流排序)

    1.DRF初始化 1.认证 2.权限 3.限流 4.序列化 5.分页 6.版本  7.过滤 8.排序 1.1安装DjangoRestFramework pip install djangoresfra ...

  4. ModelViewSet+ModelSerializer使用

    1.DRF初始化 DRF框架的8个核心功能 1.认证(用户登录校验用户名密码或者token是否合法) 2.权限(根据不同的用户角色,可以操作不同的表) 3.限流(限制接口访问速度) 4.序列化(返回j ...

  5. drf相关问题

    drf自定义用户认证: 登录默认 使用django的ModelBackend,对用户名和密码进行验证.但我们平时登录网站时除了用户名也可以用邮箱或手机进行登录,这就需要我们自己扩展backend 一. ...

  6. django drf 基础学习2

    DRF基本程序调用一 models初步编写  1 编写model.py    from django.db import models 导入    class dbinfo(models.Model) ...

  7. DRF 认证、权限、限制

    DRF 认证.权限.限制   认证: 定义一个用户表和一个保存用户的Token表 # ======================day96======================= class ...

  8. DRF 版本 认证

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢大家都知道我们开发项目是有多个版本的 当我们项目越来越更新~版本就越来越多我们不可能新的版本出了~以前旧的版本 ...

  9. DRF 权限和频率

    Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...

随机推荐

  1. 【typedef】Type definitions 自定义类型

  2. spark-3-macOS配置hadoop+spark+IDE

    [教程1]https://blog.csdn.net/shiyutianming/article/details/99946797  + [教程2]http://dblab.xmu.edu.cn/bl ...

  3. Python练习题 045:Project Euler 017:数字英文表达的字符数累加

    本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...

  4. spring-boot-route(一)Controller接收参数的几种方式

    Controller接收参数的常用方式总体可以分为三类.第一类是Get请求通过拼接url进行传递,第二类是Post请求通过请求体进行传递,第三类是通过请求头部进行参数传递. 1 @PathVariab ...

  5. Linux知识点笔记

    Linux启动脚本 rcS文件,rcS文件位于系统根目录下的"/etc/init.d"下.  rcS文件本质是一个bash shell脚本,因此遵循bash脚本的语法规则. [1] ...

  6. Office远程代码执行漏洞(CVE-2017-11882)

    POC: https://github.com/Ridter/CVE-2017-11882/ 一.简单的生成弹计算器的doc文件. 网上看到的改进过的POC,我们直接拿来用,命令如下: #python ...

  7. C++(VS2015)模板显式特化之template语法深入理解

    首先说下遇到的情况: 这里在vc++6.0上建立了一个自定义模板类,再去覆盖这个类,分别使用部分覆盖,整体覆盖 但在vs2015上去整体覆盖类会报错. 错误如下: 错误原因:个人感觉是新版本的vs更接 ...

  8. Tensorflow学习笔记No.6

    数据的批标准化 本篇主要讲述什么是标准化,为什么要标准化,以及如何进行标准化(添加BN层). 1.什么是标准化 传统机器学习中标准化也叫做归一化. 一般是将数据映射到指定的范围,用于去除不同维度数据的 ...

  9. tuple的增删改查

    dict = {"k1": "v1", "k2": "v2", "k3": "v3&quo ...

  10. angular http 跨域访问

    1.在跟目录中创建配置文件:proxy.config.json ,文件内容如下: { "/api": { "target": "http://192. ...