rest认证组件,权限组件,频率组件,url注册器,响应器组件,分页器组件
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注册器,响应器组件,分页器组件的更多相关文章
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- Restful 4 -- 认证组件、权限组件、频率组件、url注册器、响应器、分页器
一.认证组件.权限组件.频率组件总结: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 1.认证组件格式 写一个认 ...
- 20.DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
一 认证组件 1. 局部认证组件 我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发, 在咱们看的APIView类中的dispatch方法的源码中,有个sel ...
- day 89 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- rest-framework框架——认证、权限、频率组件
一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...
- Rest_Framework之认证、权限、频率组件源码剖析
一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...
- DRF(5) - 频率组件、url注册器、响应器、分页器
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
- rest-framework频率组件、url注册器、响应器、分页器
频率组件 import time from rest_framework.throttling import BaseThrottle,SimpleRateThrottle IP_DICT = {} ...
随机推荐
- duration of lease 1 0.5 0.875 DHCP 租借时间 续租时间 重新绑定时间
w
- Rtmp AAC基本格式(转)
第一个audio data包:AAC sequence header 第二个audio data包:AAC raw AF表示的含义: 1)第一个字节af,a就是10代表的意思是AAC, Format ...
- MongoDB学习【一】—MongoDB简介和安装
一.MongoDB简介 1.MongoDB是什么 MongoDB是一款强大.灵活.且易于扩展的通用型数据库,MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的 ...
- mysql5.7密码登录的那些坑
mysql5.7密码策略及修改技巧 繁著 关注 2017.08.18 22:41* 字数 522 阅读 10184评论 0喜欢 4 mysql升级5.7版本以后,安全性大幅度上升. MySQL5.7为 ...
- Spring Boot系列(四) Spring Cloud 之 Config Client
Config 是通过 PropertySource 提供. 这节的内容主要是探讨配置, 特别是 PropertySource 的加载机制. Spring Cloud 技术体系 分布式配置 服务注册/发 ...
- thead tbody tfoot
<!DOCTYPE html> <html lang="en"> <head> <title>Title</title> ...
- Vue 基础 day02
Vue Devtools 安装 https://chrome.google.com/webstore/search/vue%20devtools?hl=zh-CN 需要翻墙 过滤器 概念: Vue.j ...
- ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibat
这是一个由粗心导致的错误,具体报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSessio ...
- Ant-编译构建(2)-第3方jar包引入、log4j2
1.项目目录结构图,lib包引入了一些关于common logging+log4j2相关的jar. 2.编写相关的build.xml <?xml version="1.0" ...
- 手动刷新客户端配置内容(Spring Cloud Config)
手动刷新客户端配置内容 客户端项目增加依赖项 <dependency> <groupId>org.springframework.boot</groupId> &l ...