def 自定义表设置以及初步认识vue
# 1 快速签发和认证
# 2 定制返回格式和认证
# 3 自定义登录和认证
------------------
# 4 自定义登录,自定义表
# 5 自定义认证类
路由:
from django.contrib import admin from django.urls import path from rest_framework.routers import SimpleRouter from .views import UserView router = SimpleRouter() router.register('user', UserView, 'user') urlpatterns = [ ] urlpatterns += router.urls
视图类:
from django.contrib import admin from django.urls import path from rest_framework.routers import SimpleRouter from .views import UserView router = SimpleRouter() router.register('user', UserView, 'user') urlpatterns = [ ] urlpatterns += router.urls
序列化类:
from rest_framework import serializers from .models import UserInfo from rest_framework.exceptions import APIException from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenObtainSerializer # 只做校验 class LoginSerializer(serializers.Serializer): username = serializers.CharField() password = serializers.CharField() def validate(self, attrs): username = attrs.get('username') password = attrs.get('password') user = UserInfo.objects.filter(username=username, password=password).first() if user: # 签发token,使用RefreshToken直接签发 refresh = RefreshToken.for_user(user) return { 'code': 100, 'msg': '登录成功', 'username': username, # 'icon':user.icon, 'access': str(refresh.access_token), 'refresh': str(refresh) } else: raise APIException({'code': 999, 'msg': '用户名或密码错误11'})
表模型
class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) age = models.IntegerField() gender = models.IntegerField(choices=((1, '男'), (2, '女'), (0, '未知')))
基于自定义表编写认证类.
from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import APIException from rest_framework_simplejwt.tokens import AccessToken from rest_framework_simplejwt.authentication import JWTAuthentication # JWTAuthentication 有authenticate 里面完成对token的认证 from .models import UserInfo class LoginAuthentication(BaseAuthentication): def authenticate(self, request): # 1 取出前端传入的token:它放哪了?后端定的:定死key值叫token:value值直接不带任何前缀 token = request.META.get('HTTP_TOKEN') if token: # validated_token = self.get_validated_token(token)---》返回了AccessToken(token)传入的对象 # 2 拿到token,验证token是否合法,是否过期,是否被篡改,伪造,如果都通过,根据payload中得userid取出当前用户 try: validated_token = AccessToken(token) # 源码中拿出来的 except Exception as e: raise APIException({'code': 888, 'msg': str(e)}) # 3 取出用户id,根据用户id,查出用户,返回 # validated_token.payload['user_id'] # validated_token['user_id'] user = UserInfo.objects.filter(pk=validated_token['user_id']).first() return user, token else: raise APIException({'code': 101, 'msg': 'token必须携带'})
全局使用 - - -局部使用 :
****************************************
权限控制:
def中有权限控制
真正的权限控制有:
acl权限控制:访问控制列表 Access Control List -互联网,对外项目 -用户可以: user_id:1=[刷视频,评论,收藏,开直播] user_id:2=[刷视频] -表表示出权限 用户表: id name 1 王叔 2 李四 3 张三 权限表: id user_id permission_id 1 1 1 2 1 2 3 1 3 4 1 4 5 2 1 权限详情表: id name url method 1 刷视频 /video/ get 2 评论 /commit/ post 3 收藏 4 开直播 -权限类:根据当前登录用户---》取出它所有权限,权限列表---》当前访问的比如是评论,如果有权限,返回True,没有权限,返回false 2 rabc权限控制:基于角色的访问控制 Role-Based Access Control -公司内部项目 -用户属于某个角色 -角色跟权限有对应关系 - 公司内有 财务 hr 开发 总裁 -财务:张xx,李xx :发工资权限,扣工资权限 -hr: 王xx,王xx :招员工,开除员工 -开发:张xx,李xx: 看代码 开发代码,删除代码 -总裁:刘xx :查看公司财报 -rbac表设计 -用户表:用户和角色是 多对多 -角色表(部门,组): 角色和权限 多对多 -权限表: -用户和权限:多对多 -总共6 张表,表示基于角色的访问控制:rbac+acl -django的后台管理就是基于rbac控制---》auth下有些表 auth_user:# 用户表 auth_group:# 组表(角色) auth_permission:# 权限表 auth_group_permissions # 组和权限中间表 auth_user_groups # 用户和组 中间表 auth_user_user_permissions# 用户和权限多对多中间表 -演示rbac权限控制 -创建一个超级用户 root 123456 对网站有所有权限 -创建一个用户[张三],创建一个组[测试组1],给测试组1加权限[book的增删查改] -张三登录,发现张三有 测试组1的所有权限 -新增用户李四,没有任何组,登录后没有任何权限 -把李四放到 测试组1 ,有测试组1的所有权限:查看图书,修改图书,删除图书 -李四增加一个新增图书权限: -新增图书权限 加入到 测试组1 张三也有这个权限,不好 -单独给李四增加一个 新增图书权限 3 ABAC:Attribute-Based Access Control,基于属性的访问控制 -公司内部项目 # 公司内部项目,所有项目几乎都要有rbac权限 -基于django的admin做二次开发---》美化页面--》混合 -django+vue--》实现基于rbac的访问控制 -django-vue-admin -gin-vue-admin: -java:若依
vue介绍
前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <h1>{{s}}</h1> </div> </body> <script> new Vue({ el: '#app', data: { 's': "hello world" } }) </script> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?