【异常处理 详见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 ----------------------------------------
(其他功能待学习添加)