权限控制
# ACL(访问控制列表)的权限控制:(针对互联网用户的产品)
用户表
id name password
1 zhangsan 123
权限表
id user_id 权限
1 1 评论权限
2 1 发抖音权限
张三:[评论权限,发抖音权限]
# RBAC(Role-Based Access Control)基于角色的访问控制:(针对于公司内部项目)
权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
# django的auth其实就实现了基于角色的访问控制---》通过表控制的
-auth_user :用户表,存用户信息
-auth_group:组,角色,存放角色信息
-auth_permission:权限,存放权限信息
# 分析:一个组(角色)中,有多个用户,一个用户,属于多种角色----》多对多
-auth_user_groups:用户和组的多对多中间表
# 分析:一个组,可能有多个权限,一个权限,也可能属于多个组---》多对多
-auth_group_permissions:组和权限的多对多中间件
# django,多了张表:auth_user_user_permissions
# 分析:一个用户,可以有多个权限,一个权限,可以分配个多个用户---》多对多
-auth_user_user_permissions:用户和权限多对多中间表
我们开发中做权限控制
# python开发,公司内部项目多,使用基于角色的访问控制的权限,比较多
# python+django 开发出一套公司内部项目,要带rbac的权限控制
-1 基于django的auth+admin 快速开发,有更多操作,但是没学
-2 基于django的auth+admin+第三方美化 快速开发
-国内的:simple-ui,xadmin(弃用了)
-国外的:
-3 基于django+vue+自定制权限
-djagno-vue-admin :第三方开源
-4 完全自己写
基于django的auth+admin+第三方美化 快速开发
# 1 安装
pip3 install django-simpleui
# 2 配置文件配置,注册app
INSTALLED_APPS = [
'simpleui',
...
]
# 3 菜单栏定制
# 4 自定义菜单和页面
# 5 自定义按钮
# 6 切换图标
# 7 首页显示的隐藏
# 其实它可以开发出任意各种功能
djagno-vue-admin演示
# https://gitee.com/liqianglog/django-vue-admin
drf大回顾
1 drf入门规范
-前后端开发模式:混合,分离
-API接口:地址,请求方法,请求参数,返回值
-postman的使用
-序列化和反序列化
-restful规范
-http响应状态码
-想在django中写符合规范的接口
-djangorestframework:django的app
-快速使用
2 CBV源码分析
-路由中 视图类.as_viwe()--->django的View的as_viwe()---->执行结果 view内存地址----》请求来了,路由匹配成功----》view(request)---->return self.dispatch()--->View的dispatch---》通过反射,不同的请求会执行视图类中跟请求同名的方法
3 APIView执行流程
# APIView 继承了View
# 视图类:class BookView(APIView):
# 路由中 视图类.as_viwe()--->drf的APIView的as_viwe()--->调用父类的as_view,去除csrf---》View类的as_view内部的view闭包函数(加了个装饰器)---》view(request)---->return self.dispatch()---》APIView的dispatch()
# 以后视图类,只要继承APIView及其子类
# 装饰器的本质原理
@装饰器 # add=装饰器(add)
def add()
# 闭包函数
# 补充
类中:self
类中:super()
多方式登陆接口
表
class Userinfo(AbstractUser):
phone = models.CharField(max_length=64)
视图类
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from .serializer import Loginserializer
class login(ViewSet):
def login(self, request):
ser = Loginserializer(data=request.data)
if ser.is_valid():
user = ser.user
token = ser.token
return Response({'code': 200, 'msg': '成功', 'username': user.username, 'token': token})
else:
return Response({'code': 201, 'msg': ser.errors})
序列化
import re
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler
from .models import Userinfo
class Loginserializer(serializers.ModelSerializer):
username = serializers.CharField()
class Meta:
model = Userinfo
fields = ['username', 'password']
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
if re.match(r'^1[3-9][0-9]{9}$', username):
user = Userinfo.objects.filter(phone=username).first()
elif re.match(r'^.+@.+$', username):
user = Userinfo.objects.filter(email=username).first()
else:
user = Userinfo.objects.filter(username=username).first()
if user and user.check_password(password):
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
self.user = user
self.token = token
return attrs
else:
raise ValidationError('用户名或密码错误')
路由
from django.urls import path
from app01.views import *
urlpatterns = [
path('login/', login.as_view({'post': 'login'})),
]