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. netty关键字

    ------------恢复内容开始------------ buffer 本质读写的内存,三个属性:capacity.position和limit capacity:容器大小 position:读写 ...

  2. CentOS7 【linux系统】配置 JDK 教程

    1. 下载 [linux版本] JDK 1.8 的包. 2. 导入linux系统里面. 如何导入,下载一个winSCP 软件 破解安装,然后再linux 系统里面 查询IP,连接即可. 在linux解 ...

  3. Python-开发规范-遵循PEP8规范

    Python中空白 1. 4个空格表示缩进,用4个空格代替一个TAB 2. 不再逗号.分号.冒号前加空格,应该在其后加空格 3. 关系运行符.数学运算符.逻辑运算符.赋值运算符 前后都加一个空格 4. ...

  4. Copy As HTML From VSCode

    JS生成可自定义语法高亮HTMLcode cnblogs @ Orcim  !deprecated! 这里有更好的方案,具体看我的这篇博客博客代码高亮的另一种思路 这篇文章介绍了如何在博客里插入一段 ...

  5. 山寨一个Spring的@Component注解

    1. 前言 我们在上一篇对Mybatis如何将Mapper接口注入Spring IoC进行了分析,有同学问胖哥这个有什么用,这个作用其实挺大的,比如让你实现一个类似@Controller的注解(或者继 ...

  6. makefile从入门到入门

    makefile文件是用来帮助编译和管理C++项目代码的,需要配合make命令使用.makefile里也可以执行shell操作,具备一部分.sh脚本的功能. makefile格式 makefile内容 ...

  7. Visual C++中各种文件的作用(详细)

    参考:http://blog.sina.com.cn/s/blog_6975d67c0100r3kx.html DSW:全称是Developer Studio Workspace,最高级别的配置文件, ...

  8. 1-kubeadm部署1.18.0单master集群

    1.有了docker,为什么还用kubernetes? 访问工具层 帮助用户更高效的完成任务,包括web控制台.RESTfulAPI.CI/CD.监控管理.日志管理 PaaS服务层 为开发.测试和运维 ...

  9. vector专题

    <C++程序设计语言(第4部分:标准库)> 31.4 容器 31.4.1 vector 31.4.1.1 vector和增长 重要知识点:vector的内存布局 vector不会在添加每个 ...

  10. 本溪6397.7539(薇)xiaojie:本溪哪里有xiaomei

    本溪哪里有小姐服务大保健[微信:6397.7539倩儿小妹[本溪叫小姐服务√o服务微信:6397.7539倩儿小妹[本溪叫小姐服务][十微信:6397.7539倩儿小妹][本溪叫小姐包夜服务][十微信 ...