【异常处理 详见excel的异常处理的源码总结】

# APIView--->dispatch--->三大认证,视图类的方法,如果出了异常,
# 会被异常捕获,捕获后统一处理
# 关键就是dispatch里面的  response = self.handle_exception(exc) 这行代码

# drf 内置了一个函数,只要上面过程出了异常,就会执行这个函数,
# 这个函数只处理的drf的异常

# 主动抛的非drf的异常,或程序出错了报的异常,都不会被处理

# 非drf的异常会又被主动抛出来,导致程序报错!!!
---------------------------------------------------

# 我们的目标,无论主动抛还是程序运行出错,都统一返回规定格式,怎么办?
   公司里一般返回   {code:999,'msg':'系统错误,请联系系统管理员'}

(异常处理函数)

# 写一个函数,内部处理异常,在配置文件中配置一下即可

# 全局异常函数处理
from datetime import datetime

from rest_framework.response import Response
from rest_framework.views import exception_handler


def common_exception_handler(exc, context):
# exc 异常错误对象
# context:上下文就是一个大字典,包含有view(哪个视图类处理错误),args,kwargs,request
# 有view:当前出错的视图类的对象,
# args和kwargs视图类方法分组出来的参数,
# request:当次请求的request对象
# 只要走到这里,就要记录日志 ,只有错了,才会执行这个函数
# 记录日志尽量详细
print('时间,登录用户id,用户ip,请求方式,请求地址,执行的视图类,错误原因')
print(
f'时间:{datetime.now()},登录用户id:{context.get("request").user.id},
  用户ip:{context.get("request").META.get("REMOTE_ADDR")},
  请求方式:{context.get("request").method},
  请求地址:{context.get("request").path},
  执行的视图类:{context.get("view")},错误原因:{exc}')

res = exception_handler(exc, context)
'''
时间,登录用户id,用户ip,请求方式,请求地址,执行的视图类,错误原因
时间:2024-04-18 15:14:14.771919,
登录用户id:None,用户ip:127.0.0.1,
请求方式:GET,请求地址:/app07/users/,
执行的视图类:<app07.views.UserView object at 0x0000014A96744E50>,
错误原因:division by zero
'''
if res:
# 有值,说明返回了Response 对象,没有值说明返回None
# 如果是Response对象说明是drf的异常,已经被处理了
# 如果是None表明没有处理,就是非drf的异常
# ValidationError和AuthenticationFailed这两个异常,一个是字典一个是列表,如果用get取值,ValidationError没办法走这个函数,要加判断
# res = Response(data={'code': 666, 'msg': res.data.get('detail', '请联系系统管理员')})
if isinstance(res.data, dict):
err = res.data.get('detail', '请联系系统管理员')
elif isinstance(res.data, list):
err = res.data[0]
else:
err = '请联系系统管理员'
res = Response(data={'code': 666, 'msg': f'[drf的异常]:{err}'})

else:
err = str(exc)
# 记录日志
res = Response(data={'code': 999, 'msg': f'[django的异常]:{err}'})

return res
--------------------------------------------------- 

# 在配置文件中配置 REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'app07.exceptions.common_exception_handler', }

 。

【接口文档的介绍】

 1 # 前后端分离
 2     -我们做后端,写接口
 3     -前端做前端,根据接口写app,pc,小程序
 4 
 5     -作为后端来讲,我们很清楚,比如登录接口  /api/v1/login/---->post----
 6 >username,password 编码方式json----》返回的格式  {code:100,msg:登录成功}
 7 
 8 
 9     -后端人员,接口写完,一定要写接口文档
10 
11 --------------------------------------------------
12 # 接口文档如何编写
13 -1 使用word,md 编写接口文档
14 
15 -2 使用第三方平台,编写我们的接口文档(非常多)---》蛮好用的
16     -https://www.showdoc.com.cn/item/index     (jinhao)
17 
18 -3 公司自己使用第三方开源的搭建的---》Yapi ---
》你如果想自己搭建,参照笔记 19 -https://zhuanlan.zhihu.com/p/366025001 20 21 -4 使用drf编写的接口,可以自动生成接口文档 22 swagger---》drf-yasg---》官方推荐使用 23 coreapi----》咱们讲 24 25 -------------------------------------------------- 26 # 使用coreapi自动生成接口文档步骤 27 - 1 安装 28 pip3.8 install coreapi -r http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/ 或是pip3 install coreapi
- 2 在总路由里配置
    from rest_framework.documentation import include_docs_urls
    path('docs/', include_docs_urls(title='xx项目接口文档')),

-3 在视图类,方法上,写注释即可
    -在类上加注释
    -在类的方法上加注释
    -在序列化类或表模型的字段上加  help_text,required。。。。


-4 配置文件配置
	REST_FRAMEWORK = {
		'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',}

-5 访问地址:http://127.0.0.1:8000/docs

--------------------------------------------------

# 接口文档,需要有的东西
-描述
-地址
-请求方式
-请求编码格式
-请求数据详解(必填,类型)
-返回格式案例
-返回数据字段解释
-错误码
 

 (showdoc的使用步骤:支持postman)

 

 (自己写接口文档测试)

模型表中配置

 视图类中配置

 序列化器中配置

 

 

 【JWT介绍】

  Json web token (JWT) 就是web方向token的使用

1 jwt 是什么?
	-全称是:json  web  token
    -是一种前后端登陆认证的方案,区别于之前的 cookie,session
    -它有 签发阶段--》登陆成功后签发
    -它有 认证阶段--》需要登陆后才能访问的接口,通过认证后,才能继续操作
2  jwt原理--》session,cookie比较

 

 

 1 #JWT的构成 三部分,每部分用 .  分割
 2 
 3 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
 4 
 5 - 头:header
 6          声明类型,这里是jwt
 7          声明加密的算法 通常直接使用 HMAC SHA256
 8          公司信息。。。
 9 
10 -荷载:payload
11         -存放有效信息的地方
12         -过期时间
13         -签发时间
14         -用户id
15         -用户名字。。。
16 
17 -签名:signature
18         -第一部分和第二部分通过秘钥+加密方式得到的
-签发阶段:通过头和荷载 使用 某种加密方式[HS256,md5,sha1]加密得到
            -校验阶段:拿到token,取出第一和第二部分---》通过之前同样的加密方式加密得到新签名--》用新签名和第三段(传入的老签名)比较--》
如果一样--》说明没有被篡改过--》信任--》如果不一样--》说明是被篡改了,或模拟生成的--》不能信任,返回错误

19 ------------------------------------------------------------------------------ 20 21 # jwt开发重点 22 -登录接口----》签发token 23 -认证类-----》jwt认证 24 25 ----------------------------------------------------------------------------------- 26 27 # base64编码和解码 28 29 import base64 30 import json 31 dic={'name':john,'age':"25"} 32 33 dic_str=json.dumps(dic) 34 35 #把这个字符串使用base64编码 36 res=base64.b64encode(dic_str.encode('utf-8')) 37 print(res) 38 39 40 # 解码 41 res=base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=') 42 print(res) 43 # 注意:base64编码后,字符长度一定是4的倍数,如果不是,使用 = 补齐, = 不表示数据 44 45 ---------------------------------------------- 46 # base64 应用场景 47 48 ''' 49 1 jwt 使用了base64 50 2 网络中传输数据,也会经常使用 base64编码 51 3 网络传输中,有的图片就是使用base64编码,如12306登录时候扫码登录的二维码 52 ''' 53 54 s='图片文件二进制数据经过base64编码后的数据' 55 res=base64.b64decode(s) 56 with open('a.png','wb') as f: 57 f.write(res) 58 # wb模式写入文件,图片出解出来了

 

 3.simple-jwt使用

 1 # 项目中使用jwt认证方案
 2     -jwt:所有web框架都可能采用这种认证方案
 3         -框架
 4         -语言
 5 # python的django框架中--》使用jwt
 6     -1 自己写:登录,认证
 7     -2 使用第三方
 8         -django:simple-jwt,django-rest-framework-jwt(不用了)
 9         -flaks:flask-jwt-extended
10         
11         
12 # 使用simple-jwt 快速体验  pip install djangorestframework-simplejwt
13     - 登陆签发:默认使用auth的user表--》创建个用户--》能登录了
14         路由:   登陆接口了 
15         path('login/', token_obtain_pair), 
16         # 127.0.0.1:8080/app01/login-->post--》用户名密码就能登陆
17     - 认证
18     class UserTokenView(GenericViewSet, mixins.CreateModelMixin):
19         # 必须登陆后才能新增
20         authentication_classes = [JWTAuthentication]
21         permission_classes = [IsAuthenticated]

 

 

  -refresh:刷新用,access实现,获取新的access用
    -access:咱们用的
	-双token认证:
      在双token认证中,access_token是一种JWT(json web token),其有效时间通常较短。
      用户在获取资源时需要携带这个access_token。然而,当access_token过期后,如果是活跃用户,就可以使用refresh_token来获取一个新的access_token,
      从而避免了用户因token过期而被中断操作,需要重新登录的麻烦。

 总结:refresh和access解密,发现除了第三部分不一样,其他两个部分都一样

 

 

 4.simple-jwt配置文件

 1 SIMPLE_JWT = {
 2     'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),  # Access Token的有效期
 3     'REFRESH_TOKEN_LIFETIME': timedelta(days=1),  # Refresh Token的有效期
 4     
 5     # 对于大部分情况,设置以上两项就可以了,以下为默认配置项目,可根据需要进行调整
 6     
 7     # 是否自动刷新Refresh Token
 8     'ROTATE_REFRESH_TOKENS': False,  
 9     # 刷新Refresh Token时是否将旧Token加入黑名单,如果设置为False,则旧的刷新令牌仍然可以用于获取新的访问令牌。需要将'rest_framework_simplejwt.token_blacklist'加入到'INSTALLED_APPS'的配置中
10     'BLACKLIST_AFTER_ROTATION': False,  
11     'ALGORITHM': 'HS256',  # 加密算法
12     'SIGNING_KEY': settings.SECRET_KEY,  # 签名密匙,这里使用Django的SECRET_KEY
13     # 如为True,则在每次使用访问令牌进行身份验证时,更新用户最后登录时间
14     "UPDATE_LAST_LOGIN": False, 
15     # 用于验证JWT签名的密钥返回的内容。可以是字符串形式的密钥,也可以是一个字典。
16     "VERIFYING_KEY": "",
17     "AUDIENCE": None,# JWT中的"Audience"声明,用于指定该JWT的预期接收者。
18     "ISSUER": None, # JWT中的"Issuer"声明,用于指定该JWT的发行者。
19     "JSON_ENCODER": None, # 用于序列化JWT负载的JSON编码器。默认为Django的JSON编码器。
20     "JWK_URL": None, # 包含公钥的URL,用于验证JWT签名。
21     "LEEWAY": 0, # 允许的时钟偏差量,以秒为单位。用于在验证JWT的过期时间和生效时间时考虑时钟偏差。
22     # 用于指定JWT在HTTP请求头中使用的身份验证方案。默认为"Bearer"
23     "AUTH_HEADER_TYPES": ("Bearer",), 
24     # 包含JWT的HTTP请求头的名称。默认为"HTTP_AUTHORIZATION"
25     "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION", 
26      # 用户模型中用作用户ID的字段。默认为"id"。
27     "USER_ID_FIELD": "id",
28      # JWT负载中包含用户ID的声明。默认为"user_id"。
29     "USER_ID_CLAIM": "user_id",
30     
31     # 用于指定用户身份验证规则的函数或方法。默认使用Django的默认身份验证方法进行身份验证。
32     "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",
33     #  用于指定可以使用的令牌类。默认为"rest_framework_simplejwt.tokens.AccessToken"。
34     "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
35     # JWT负载中包含令牌类型的声明。默认为"token_type"。
36     "TOKEN_TYPE_CLAIM": "token_type",
37     # 用于指定可以使用的用户模型类。默认为"rest_framework_simplejwt.models.TokenUser"。
38     "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",
39     # JWT负载中包含JWT ID的声明。默认为"jti"。
40     "JTI_CLAIM": "jti",
41     # 在使用滑动令牌时,JWT负载中包含刷新令牌过期时间的声明。默认为"refresh_exp"。
42     "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
43     # 滑动令牌的生命周期。默认为5分钟。
44     "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
45     # 滑动令牌可以用于刷新的时间段。默认为1天。
46     "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
47     # 用于生成access和刷refresh的序列化器。
48     "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer",
49     # 用于刷新访问令牌的序列化器。默认
50     "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
51     # 用于验证令牌的序列化器。
52     "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
53     # 用于列出或撤销已失效JWT的序列化器。
54     "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer",
55     # 用于生成滑动令牌的序列化器。
56     "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer",
57     # 用于刷新滑动令牌的序列化器。
58     "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
59 }

=============================================================================================================
# 我们项目中配置 settings.py中
from datetime import timedelta
SIMPLE_JWT ={
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),  # Access Token的有效期
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),  # Refresh Token的有效期
    "AUTH_HEADER_TYPES": ("TOKEN",),
}

 drf01项目目录里面

5.定制登录成功返回格式

 1 # 编写序列化类,给登录接口用,--simp-jwt写的登录接口
 2 # 默认使用 TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer"
 3 # 自己写个序列化类,定制登录成功返回格式字段
 4 from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
 5 
 6 
 7 class CommonTokenObtainSerializer(TokenObtainPairSerializer):
 8     # 定制荷载中的数据,但是要求加个用户名
 9     @classmethod
10     def get_token(cls, user):
11         token = super().get_token(user)
12         # 给payload添加自定义字段
13         token['username'] = user.username
14         return token
15 
16     # 重写全局钩子--用来校验
17     # def validate(self, attrs: Dict[str, Any]) -> Dict[str, str]:
18     def validate(self, attrs):
19         # 还有原来父类的校验,校验用户名和密码
20         super().validate(attrs)
21         token = self.get_token(self.user)  # 这里的token是对象,当字典用
22         data = {'code': 100,
23                 'msg': '登录成功',
24                 'username': self.user.username,
25                 'refresh': str(token),
26                 'access': str(token.access_token)
27                 }
28         return data

====================================================================settings里面配置
### 2 配置文件配置
SIMPLE_JWT ={
    'TOKEN_OBTAIN_SERIALIZER':'app01.serializer.CommonTokenObtainSerializer'
}

 

(定制payload格式)

###1 写个序列化类,继承TokenObtainPairSerializer--》重新validata方法
class CommonTokenObtainSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        # super()--->代指父类对象--》
        # 对象调用类的绑定方法--->会自动把对象的类传入
        token = super().get_token(user)
        token['name'] = user.username
        return token
    def validate(self, attrs):
        dic = super().validate(attrs)  
        data = {'code': 100,
                'msg': '登录成功',
                'username': self.user.username,
                'refresh': dic.get('refresh'),
                'access': dic.get('access')
                }
        return data

【多方式登陆

视图类

from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action


class UserJWTView(GenericViewSet):
    serializer_class = UserJWTSerializer

    @action(methods=['POST'], detail=False)
    def login(self, request, *args, **kwargs):
        # 使用序列化类,取出手机号/用户名/邮箱+密码,去校验数据,校验通过,签发token
        # 逻辑在序列化类里处理
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():  # 执行三层认证
            # 校验数据通过,会把user.access和refresh都放到序列化类对象中,返回给前端
            # context:有个序列化类,把视图类中的变量都给序列化类,序列化类的变量给视图类,就是个字典
            refresh = serializer.context.get('refresh')
            access = serializer.context.get('access')
            return Response({'code': 100, 'msg': '登录成功', 'refresh': refresh, 'access': access})
        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})

 

 1 序列化类
 2 两个版本
 3 
 4 class UserJWTSerializer(serializers.Serializer):
 5     username = serializers.CharField()  # 可能是用户名,手机号,邮箱
 6     password = serializers.CharField()
 7 
 8     # 逻辑处理
 9     def validate(self, attrs):
10         # 取出手机号/用户名/邮箱+密码去数据库中校验,校验成功签发,放到context中
11         # 校验用户
12         username=attrs.get('username')
13         password=attrs.get('password')
14         # 去数据库中查用户,用户可能是手机号/用户名/邮箱
15         if re.match(r'^1[3-9][0-9]{9}$', username):
16             user = UserInfo.objects.filter(mobile=username).first()
17         elif re.match(r'^.+@.+$', username):
18             user = UserInfo.objects.filter(email=username).first()
19         else:
20             user = UserInfo.objects.filter(username=username).first()
21         if user and user.check_password(password):
22             # 通过user对象签发token
23             token=RefreshToken.for_user(user)
24             self.context['access'] = str(token.access_token)
25             self.context['token'] = str(token)
26             return attrs
27 
28         else:
29             raise ValidationError('用户名或密码错误')
30 
31 
32 # =================================================升级版本
33 class UserJWTSerializer(serializers.Serializer):
34     username = serializers.CharField()  # 可能是用户名,手机号,邮箱
35     password = serializers.CharField()
36 
37     def _get_user(self, attrs):
38         username = attrs.get('username')
39         password = attrs.get('password')
40         # 去数据库中查用户,用户可能是手机号/用户名/邮箱
41         if re.match(r'^1[3-9][0-9]{9}$', username):
42             user = UserInfo.objects.filter(mobile=username).first()
43         elif re.match(r'^.+@.+$', username):
44             user = UserInfo.objects.filter(email=username).first()
45         else:
46             user = UserInfo.objects.filter(username=username).first()
47         if user and user.check_password(password):
48             # 通过user对象签发token
49             return user
50         else:
51             raise ValidationError('用户名或密码错误')
52 
53     # 逻辑处理
54     def validate(self, attrs):
55         # 取出手机号/用户名/邮箱+密码去数据库中校验,校验成功签发,放到context中
56         # 校验用户
57         user = self._get_user(attrs)
58         token = RefreshToken.for_user(user)
59         self.context['access'] = str(token.access_token)
60         self.context['refresh'] = str(token)
61         return attrs
路由

router.register('jwt', UserJWTView, 'jwt')
urlpatterns = [
    # # 方案一: 前面可以再加前缀
    path('api/v1/', include(router.urls)),
    path('users/', UserView.as_view()),
    path('login/', token_obtain_pair), 
]

总结

1 校验数据,放到序列化类的 validate中,而不放在视图类的方法中乐
2 视图类和序列化类直接交互变量
        serializer.context
3 user.check_password  必须是auth的user表,校验密码使用它
4 attrs必须返回值,返回空报错
5 视图类的方法校验失败的else中:也要return Response
6 如何签发token
    token = RefreshToken.for_user(user)
    self.context['access'] = str(token.access_token)
    self.context['refresh'] = str(token)

 

【自定义用户表,手动签发和认证】

 路由

 

 1 视图类
 2 
 3 # 自定义用户表,手动签发和认证
 4 class UserOurJWTView(GenericViewSet):
 5     serializer_class = UserOurJWTSerializer
 6 
 7     @action(methods=['POST'], detail=False)
 8     def login(self, request, *args, **kwargs):
 9         serializer = self.get_serializer(data=request.data)
10         if serializer.is_valid():  # 执行三层认证
11             refresh = serializer.context.get('refresh')
12             access = serializer.context.get('access')
13             return Response({'code': 100, 'msg': '登录成功', 'refresh': refresh, 'access': access})
14         else:
15             return Response({'code': 101, 'msg': '用户名或密码错误'})
16 
17 
18 # 认证类
19 class PublishView(GenericViewSet):
20     # 必须登录才能访问
21     authentication_classes = [JWTOurAuth]
22 
23     def list(self, request):
24         return Response({'code': 100, 'msg': '获取成功'})

 

 1 序列化类
 2 
 3 class UserOurJWTSerializer(serializers.Serializer):
 4     username = serializers.CharField()
 5     password = serializers.CharField()
 6 
 7     def _get_user(self, attrs):
 8         username = attrs.get('username')
 9         password = attrs.get('password')
10         user = User.objects.filter(username=username, password=password).first()
11         if user:
12             # 通过user对象签发token
13             return user
14         else:
15             raise ValidationError('用户名或密码错误')
16 
17     # 逻辑处理
18     def validate(self, attrs):
19         user = self._get_user(attrs)
20         token = RefreshToken.for_user(user)
21         self.context['access'] = str(token.access_token)
22         self.context['refresh'] = str(token)
23         return attrs
 1 认证类
 2 
 3 
 4 from rest_framework_simplejwt.authentication import JWTAuthentication
 5 from .models import User
 6 
 7 
 8 class JWTOurAuth(JWTAuthentication):
 9     def authenticate(self, request):
10         # 取出用户携带的access---》放请求头中:Authorization
11         token = request.META.get('HTTP_AUTHORIZATION')
12         if token:
13             # 校验token--》validated_token 返回的就是可以信任的payload
14             validated_token = self.get_validated_token(token)
15             user_id = validated_token['user_id']
16             user = User.objects.filter(pk=user_id).first()
17             return user, token
18         else:
19             raise AuthenticationFailed('请携带登录信息')

 。

【权限介绍】

# 1 写过权限类---》控制用户,是否有权限访问我们的接口
# 2 之前咱们直接定死,普通用户,超级用户,管理员 这种身份,给不同人设置不同权限

# 3 比如都是互联网用户:抖音  acl控制
	-游客用户只能查看
    -登陆用户可以查看和评论
    -粉丝超过1000用户,开直播
    
# 4 公司内部 这些权限
	-招员工
    -发工资
    -开发代码
    -删除代码
    -开董事会
    -开除员工
    ---分部门:开放部门:开发代码,删除代码
    ---人力资源:招员工,开除员工
    ---财务部门:发工资
    ---董事会:开董事会
    
# 5 常见的权限控制方案
	-1 acl :访问控制列表
    	-用户 :用户表
        -权限  :权限表
        -用户和权限中间表:是多对多:一个用户有多个权限,一个权限可能对应多个用户
        -将用户直接与权限对接,每个用户有个权限列表     
    -2 RBAC:Role-Based Access Control,基于角色的访问控制
    	-将用户与角色(组,部门)对接,然后角色(组,部门)与对象的权限对接。     
     -3 ABAC:Attribute-Based Access Control,基于属性的访问控制
     -4 PBAC:Policy-Based Access Control,基于策略的访问控制
        

# 6 作为python写的项目,一般是公司内部项目
	-python 写rbac权限控制比较多
    
# 7 django--》大而全--》提供了一套可以基于rbac权限控制的 后台管理
	-auth+admin:一套rbac权限控制
    -基于他admin+auth-->快速开发出公司内部的项目 
    
# 8 django中如何设计RBAC控制的--》通过6张表控制
	-auth_user  # 用户表
    -auth_group # 角色表,组表,部门表
    -auth_permission #权限表
    -auth_user_group # 中间表:用户和角色多对多
    -auth_grou_permission# 中间表:部门和权限
    -多一个:为了更细粒度的区分权限:用户和权限多对多
    -auth_user_permission
    
# 9 admin 权限演示
	-django 的admin 有什么权限,是自己增加的,就是对表的增删查改权限
    - 增加了个组[图书看-删-增组]:对图书有 查看,删除,增加权限
	- 增加用户 :lqz,属于--图书看-删-增组 
    	is_staff: 1
        is_active:1
        is_superuser:0 # 不是超级用户
    -root用户是超级管理员--》有所有权限
   

 

 。

【simpleui的使用】

# 之前公司里,做项目,要使用权限,要快速搭建后台管理
# 使用djagno的admin直接搭建,但django的admin界面不好看
---------------------------------------------

# 就有了第三方模块的美化:
    -xadmin:作者弃坑了,基于bootstrap+jq写的

    -simpleui:基于vue写的,界面更好看

--------------------------------------------

# 现在阶段,一般前后端分离比较多:后台一般是django+前端一般是vue
    -带权限的前后端分离的快速开发框架
    -django-vue-admin  # 类似于django-vue-admin的框架 是很多公司内部系统的基础框架
    -自己写

 使用步骤

 1 # simpleui官方文档,点击教程&指南  查看如何使用
 2 https://simpleui.72wo.com/docs/simpleui/
 3 
 4 -----------------------------------------------
 5 # 1 安装
 6 pip3.8 install django-simpleui
 7 
 8 # 2 在app中注册一下!! 放在注册的app的列表里面的最上面
 9 INSTALLED_APPS = [
10     'simpleui',
11                  ]
12 只要下载了模块,注册了,立马django的后台就变了
13 ----------------------------------------

 

 

 

(其他功能待学习添加)

posted on 2024-04-18 20:19  认真的六六  阅读(34)  评论(0编辑  收藏  举报