1.认证组件
  1.1 认证组件利用token来实现认证
  1.2 token认证的大概流程
  用户登录===>获取用户名和密码===>查询用户表 如果用户存在,生成token,否则返回错误信息
  1.3 示例

补充:自定义的序列化类

BookSerializer.py

class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book fields = ('title',
'price',
'publish',
'authors',
'author_list',
'publish_name',
'publish_city'
)
extra_kwargs = {
'publish': {'write_only': True},
'authors': {'write_only': True}
} publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city') author_list = serializers.SerializerMethodField() def get_author_list(self, book_obj):
# 拿到queryset开始循环 [{}, {}, {}, {}]
authors = list() for author in book_obj.authors.all():
authors.append(author.name) return authors

BookSerializer

models.py

 from django.db import models
#用户表 class User(models.Model) username=models.CharField(max_length=32),
password=models.CharFiels(max_length=32),
user_type_entry=(
(1,VIP),
(2,SVIP),
(3,VVIP),
),
user_type=models.IntegerField(choices=user_type_entry) def __str__(self):
return self.username #token表 class UserToken(models.Model):
user=models.OneToOneField('User',on_delete=models.CASADE)
token=model.CharFields(max_length=128),

models.py

urls.py

from django.urls import re_path
from serializer import views urlpatterns = [
re_path(r'books/$', views.BookView.as_view({
'get': 'list',
'post': 'create'
})),
re_path(r'books/(?P<pk>\d+)/$', views.BookView.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})),
re_path(r'user/$', views.UserView.as_view()),
]

urls.py

views.py

from django.http import JsonResponse
from rest_framework.views import APIView
from .models import (
Book,
Publish,
Author,
User,
UserToken
)
#用户登录认证
class UserView(APIView):
def post(self,request):
response=dict()
fields={"username","password"}
user_info=dict()
if fields.issubclass(set(request.data.keys()))
for key in fields:
user_info[key]=request.data[key]
user_instance=User.objects.filter(**user_info).first()
#如果用户名和密码存在,创建或者更新token
if user_info is not None:
access_token=str(uuid.uuid4()).replace('-','')
UserToken.objects.update_or_create (user=user_instance,defaults={"token":access_token})
response["status_code"]=200
response["status_message"]='登录成功'
response["status_token"]=access_token
# response["status_role"]=user_instance.get_user_type_diaplay()
else:
response["status_code"]=201
response["status_message"]="登录失败,用户名或密码错误"
#返回状态
return JsonResponse(response) #创建一个认证类
方式一:
class UserAuth():
def authenticate_header(self,request):
pass def authenticate(self,request):
#获取token
user_token=request.query_params.get('token')
try:
token=UserToken.objects.get(token=user_token)
return=token.user,token.token
except Exception:
rais APIException('没有认证')
注意:必须写authenticate_header和authenticate这两个函数名,源码中有声明,
authenticate_header中不写内容,但是必须书写,authenticate中书写逻辑
方式二:
from rest_framework.authentication import BaseAuthentication class UserAuth(BaseAuthentication):
def authenticate(self,request):
user_token=request.query_params.get("token")
try:
token=UserToken.objects.get(token=user_token) return token.user,token.token
except Exception:
raise APIException("没有认证") #访问book表需要认证和权限
class BookView(ModelViewSet):
#认证(只能是authentication_classes)
authentication_classes = [UserAuth]
#权限(只能是permission_classes)
permission_classes = [UserPerm] queryset = Book.objects.all()
serializer_class = BookSerializer

views.py

2.权限组件

views.py

2.1定义一个权限类:
class UserPerm():
#自定义返回内容
message="没有权限!"
def has_permission(self,request,view):
if request.user.user_type ==3:
return True
return False 2.2
#访问book表需要认证和权限
class BookView(ModelViewSet):
#认证(只能是authentication_classes)
authentication_classes = [UserAuth]
#权限(只能是permission_classes)
permission_classes = [UserPerm] queryset = Book.objects.all()
serializer_class = BookSerializer

views.py

3.频率组件

控制用户访问的频率

    3.1频率组件的使用
-首先定义一个频率类
-导入模块
from rest_framework.throttling import SimpleRateThrottle
-定义类
class RateThrottle(SimpleRateThrottle)
rate='5/m'#每分钟访问不能超过5次
def get_cache_key(self,request,view):
retuen self.get_ident(request) -指定一个频率类
class BookView(APIView):
throttle_class=[RateThrottle] 3.2利用FRF的简单频率来控制用户访问的频率(全局)
-导入模块
from rest_framework.throttling import SimpleRateThrottle
-定义一个频率类,一定继承SimpleRateThrottle
class RateThrottle(SimpleRateThrottle):
#指定访问的频率
scope="visit_rate"
#指定通过什么方式来区分用户
def get_cache_key(self,request,view):
return self.get_ident(request) -在全局seetings中指定频率类和访问的频率
REST_FRAMEWORK={
'DEFAULT_THROTTLE_CLASSES':("RateThrottle"),
"DEFAULE_THROTTLE_RATES"":{
"visit_rate":"5/m",
}
}

频率组件的局部使用和全局使用的流程

4.url注册器

一键创建url

    -导入模块
from django.urls import re_path,include
import views
from rest_framework import routers
-生成一个注册器的实例对象
router=routers.DafaultRouter()
-将需要生成的url接口注册
router.register(r"books",Views.BookView)
-开始自动生成url
urlpatterns=[
re_path('^',include(router.urls)),
]

url注册器的使用流程

5.响应器组件

    -导入模块
from rest_framework.renderers import JsonRender
-指定返回类
class BookView(APIView):
render_classes=[JsonRender]

响应器组件的使用

6.分页器组件

使用方法
-导入模块
from rest_framework.pagination import PageNumberPagination
-获取数据
books=Book.objects.all()
-创建一个分页器
paginater=PageNumberPagination()
-开始分页
paged_books=paginater.paginate_queryset(books,request)
-开始序列化
serialized_books=BookSerializer(paged_books,many=True)
-返回数据
return Response(serialized_books.data) -分页器的局部实现
-导入模块
from rest_framework.pagination import PageNumberPagination
-自定义一个分页类,要继承PageNumberPagination
class MyPagination(PageNumberPagination):
page_aize=2#每页显示2条数据
page_query_param='p'
page_size_query_param='size'
max_page_size=5#最多显示5条数据 -实例化一个分页类
paginater=MyPagination()
-开始分页
paged_books=paginater.paginate_queryset(books,request)
-开始序列化
serialized_books=BookSerializer(paged_books,many=True)
-返回数据
return Response(serialized_books.data)

分页器组件的使用以及局部使用

rest认证组件,权限组件,频率组件,url注册器,响应器组件,分页器组件的更多相关文章

  1. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  2. day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  3. Restful 4 -- 认证组件、权限组件、频率组件、url注册器、响应器、分页器

    一.认证组件.权限组件.频率组件总结:  只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 1.认证组件格式 写一个认 ...

  4. 20.DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    一 认证组件 1. 局部认证组件 我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发, 在咱们看的APIView类中的dispatch方法的源码中,有个sel ...

  5. day 89 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  6. rest-framework框架——认证、权限、频率组件

    一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...

  7. Rest_Framework之认证、权限、频率组件源码剖析

    一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...

  8. DRF(5) - 频率组件、url注册器、响应器、分页器

    一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...

  9. rest-framework频率组件、url注册器、响应器、分页器

    频率组件 import time from rest_framework.throttling import BaseThrottle,SimpleRateThrottle IP_DICT = {} ...

随机推荐

  1. POJ2395 Out of Hay(求最小生成树中最大的边权,Kruskal)

    POJ2395 Out of Hay 寻找最小生成树中最大的边权. 使用 Kruskal 求解,即求选取的第 \(n-1\) 条合法边. 时间复杂度为 \(O(e\log e)\) . #includ ...

  2. DRF的路由生成类的使用

    DRF路由生成类的使用 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST framework ...

  3. 在sql中使用函数,遇到net.sf.jsqlparser.parser.ParseException异常

    异常详情如下 Caused by: net.sf.jsqlparser.parser.ParseException: Encountered " "->" &quo ...

  4. IPv4首部

    <图解TCP/IP> 4.7 IPv4的首部 版本:由4比特构成,表示标识IP首部的版本号.IPv4的版本号即为4,因此在这个字段上的值也为“4”. 首部长度:由4比特构成,表明IP首部的 ...

  5. Java 基础-异常处理

    在 Java 中声明了很多异常类,每个异常类都表示一种运行错误.程序运行过程中发生一个可识别的运行错误时(可以找到与错误匹配的异常类,例如被除数为 0 时会触发 java.lang.Arithmeti ...

  6. JSP不支持EL表达式的解决方案

    EL的全称是Expression Language.1.在默认情况下,Servlet 2.3 / JSP 1.2是不支持EL表达式的,而Servlet 2.4 / JSP 2.0支持. servlet ...

  7. C++ 命名管道示例

    想做一个 Hook CreateFile 重定向到内存的功能,貌似可以假借命名管道实现这个功能.不熟悉命名管道,做了几个demo,如下: Server: // NamedPipeServer.cpp ...

  8. TNS-01106: Listener using listener name LISTENER has already been started

    -- 启动监听,提示已经启动. [oracle@sh ~]$ lsnrctl startLSNRCTL for Linux: Version 12.1.0.2.0 - Production on 06 ...

  9. js技巧之与或运算符 || && 妙用

    如题: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头:  成长速度为10显示2个箭头:  成长速度为12显示3个箭头:  成长速度为15显示4个箭头:  其他都显示都显示0各箭头.  用代码 ...

  10. 什么是HIS、PACS、LIS、RIS

    什么是HIS?医院信息系统的定义(HIS)医院信息系统(Hospital Information System,HIS)在国际学术界已公认为新兴的医学信息学(Medical Informatics)的 ...