一:管理员登录:

<一>: 准备工作:
1:安装djangorestframework-jwt拓展

pip install djangorestframework-jwt

2:编辑dev.py:

REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': (# 追加Token认证后端 —— 用于验证token有效期识别用户身份'rest_framework_jwt.authentication.JSONWebTokenAuthentication','rest_framework.authentication.SessionAuthentication','rest_framework.authentication.BasicAuthentication',),
}JWT_AUTH = {# 有效期设置为10天'JWT_EXPIRATION_DELTA': datetime.timedelta(days=10),
}

<二>:手动定义序列化器和视图实现:
在DRF编程中,我们需要尽可能使用序列化器来完成主要业务代码,视图仅仅用做映射路由,调用序列器来完成主要业务!简单一句话就是 —— 把视图的业务代码剥离开,统一组织到序列化器中实现
1:新建:apps/meiduo_admin/serializers/loginserializers.py
2: 新建apps/meiduo_admin/serializers/loginserializers.py
思路:新建一个序列化器的包:serializers, 然后在里面定义序列化器。 首先第一个登录接口,我们需要序列化器对我们的username,和password 进行校验。校验流程: 先对username和password进行常规校验,如果校验成功,使用自定义登录后端对用户名密码进行校验,这个时候就需要自定义校验了,可以采用最终的校验:validate(self,attr)这个函数进行校验,如果校验失败,需要DRF抛出异常:ValidatedError , 如果校验成功,则接下来需要给用户办法令牌。令牌的颁发需要使用:
from rest_framework_jwt.utils import jwt_payload_handler,jwt_encode_handler

from django.contrib.auth import authenticate
from rest_framework import serializers# 目的定义一个序列化器对username 和password进行校验
# 这里由于不设及模型类所以继承serializers.Serializer
from rest_framework_jwt.utils import jwt_payload_handler, jwt_encode_handlerclass LoginSerializer(serializers.Serializer):username = serializers.CharField(required=True),password = serializers.CharField(required=True),# 接下来要使用登陆验证后端来校验用户名和密码,此时就需要自定义校验---采用最终的校验def validate(self, attrs):# 由于传入的是用户名和密码的字典格式,所以可以直接拆包user = authenticate(**attrs)if user is None:raise serializers.ValidationError("用户名或者密码错误!!!")# 如果校验成功,那么就要给顾客办法令牌# 传入用户对象,得到荷载对象payload = jwt_payload_handler(user)# 传入荷载对象,得到令牌对象tocken = jwt_encode_handler(payload)return {'user': user,"tocken": tocken}

3:新建apps/meiduo_admin/views/login_views.py

from rest_framework.response import Response
from rest_framework.views import APIView# 需要继承哪个呢?---不需要对数据进行增删改查,所以只需继承APIView
from apps.meiduo_admin.serializers.loginserializers import LoginSerializerclass LoginView(APIView):def post(self, request):serializer = LoginSerializer(data=request.data)# 传入raise_exception表示如果校验失败则抛出异常serializer.is_valid(raise_exception=True)return Response({'token': serializer.validated_data.get('token'),'username': serializer.validated_data['user'].username,'user_id': serializer.validated_data['user'].id})

<三>: 使用djangorestframework-jwt拓展提供的视图接口完成:
1:编辑apps/meiduo_admin/urls.py映射接口视图:

from django.urls import re_path
# obtain_jwt_token为拓展插件提供的用于验证用户名和密码并签发token的视图
from rest_framework_jwt.views import obtain_jwt_token
from .views.login_views import *urlpatterns = [# re_path(r'^authorizations/$', LoginView.as_view()),re_path(r'^authorizations/$', obtain_jwt_token),
]

2:新建meiduo_mall/utils/jwt_response_handlers.py模块,自定义obtain_jwt_token视图中用于构造响应的函数

def jwt_response_payload_handler(token, user=None, request=None):return {# 补充返回username和user_id字段'username': user.username,'user_id': user.id,'token': token}

3:编辑dev.py:

JWT_AUTH = {# 设置签发的token的有效期'JWT_EXPIRATION_DELTA': datetime.timedelta(days=100),# 来指定拓展插件默认视图返回的响应参数构造函数'JWT_RESPONSE_PAYLOAD_HANDLER': 'meiduo_mall.utils.jwt_response_handlers.jwt_response_payload_handler'
}

<四>: 前端保存tocken的方式:
1:前端保存tocken的方式:

  • (1)、localStorage: 长期存储
  • (2)、sessionStorage: 临时存储(当浏览器关闭或者标签页关闭,数据清除)
    在美多后台管理业务中的存储为:
localStorage.token = response.data.token;
localStorage.username = response.data.username;
localStorage.user_id = response.data.user_id;

2:
rest_framework_jwt拓展的身份认证后端JSONWebTokenAuthentication所约定的前端传递token的方式:

  • (1)、在请求头中携带token值
  • (2)、具体约定的格式为

    3:前端工程师在调用接口的时候,必须按照上述既定的格式传递token参数,用于后端身份认证
this.axios.get(cons.apis + '/goods/brands/'+this.edit_id+'/', {headers: {// 请求头中携带token'Authorization': 'JWT ' + token},responseType: 'json',}).then(dat=>{this.BrandsForm.name = dat.data.name;this.BrandsForm.logo = dat.data.logo;this.BrandsForm.first_letter = dat.data.first_letter;}).catch(err=>{console.log(err.response);
});

4:后端验证tocken:
rest_framework_jwt拓展插件提供的JSONWebTokenAuthentication认证后端自动认证

REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': (# 验证用户的令牌(token)来确定用户身份# 思考:# 1、前端如何传递token值;# 答: 头部携带;Authorization: JWT gregtfefewfewfewrw.trhyt4hy.4hy46h6fewfewfewfew#      JSONWebTokenAuthentication后端会根据既定的格式提取并校验token有效性,进而获取用户身份#      把验证成功的用户对象赋值给了request.user# 2、如何校验; —— 重复加密,比对新旧签名;'rest_framework_jwt.authentication.JSONWebTokenAuthentication','rest_framework.authentication.SessionAuthentication','rest_framework.authentication.BasicAuthentication',),
}

二:权限限定:

<一>: 后台管理站点只允许员工/管理员(is_staff=True)的账号登陆签发token。
思路:不管是来自8080的还是来自8081的都要经过django后端,最后调用全局authenticate函数实现用户名和密码的校验。都要经过我们自己定义的传统身份认证后端进行认证,所以我们只需要在我们自定义后端判断是不是8081的,如果是判断is_staff是不是True,如果来自8080直接放行。

编辑apps/users/utils.py
核心代码:

 # TODO:判断是否为管理站点页面登陆,如果是需要进一步校验is_staff=True# 如果是商城页面登陆,request是一个请求对象# 如果是管理站点页面登陆,request是一个Noneif request is None and not user.is_staff:return None
# 继承Django默认的传统认证后端
class UsernameMobileAuthBackend(ModelBackend):# 重写authenticate方法# 原因:默认的authenticate方法,只会根据username字段去过滤查找用户def authenticate(self, request, username=None, password=None, **kwargs):# 允许多账号登陆的情况下,前端传来的"username"有可能是用户名也有可能是手机号try:# 1、先按用户名查找user = User.objects.get(# username=="18588269037" or mobile=="18588269037"Q(username=username) |  Q(mobile=username) | Q(email=username))except User.DoesNotExist as e:return None # 用户名找不到,返回None表示认证失败# TODO:判断是否为管理站点页面登陆,如果是需要进一步校验is_staff=True# 如果是商城页面登陆,request是一个请求对象# 如果是管理站点页面登陆,request是一个Noneif request is None and not user.is_staff:return None# 3、某一个找到了,再校验密码if user.check_password(password):return user

day01---管理员登录与数据统计相关推荐

  1. 产品需求文档、需求结构图、数据字典、全局说明、用例描述、需求描述、逻辑流程、原型设计、页面交互、登录注册、词汇表、数据统计、用户表设计、接口需求、功能清单、业务流程图、Axure原型、prd、文档实例

    产品需求文档.需求结构图.数据字典.全局说明.用例描述.逻辑流程.原型设计.页面交互.登录注册.词汇表.数据统计.用户表设计.接口需求.功能清单.业务流程图.Axure原型.prd.产品需求文档实例 ...

  2. 后台userlist.php,后台用户管理(管理员登录后管理会员)

    [预备知识] 一.PHP访问MySQL数据库 1.连接到MySQL数据库 $conn=mysql_connect("localhost","root",&quo ...

  3. [附源码]Python计算机毕业设计调查问卷及调查数据统计系统

    项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs. 项目技术: dj ...

  4. [附源码]Python计算机毕业设计调查问卷及调查数据统计系统Django(程序+LW)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+N ...

  5. 7.10网站数据统计

    需要统计的事项: UV每次访问都要把用户的ip(不管该用户有无登录)存到某个数据结构里,方便进行统计 DAU只统计登录的用户(根据用户id),对于那些没有登录的游客不进行统计.1表示访问过,为活跃用户 ...

  6. 探花交友_第11章_数据统计与内容审核(新版)

    探花交友_第11章_数据统计与内容审核(新版) 文章目录 探花交友_第11章_数据统计与内容审核(新版) 1.用户冻结解冻 1.1 用户冻结 ManageController ManageServic ...

  7. Python-Django毕业设计调查问卷及调查数据统计系统(程序+Lw)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+N ...

  8. [附源码]JAVA+ssm计算机毕业设计调查问卷及调查数据统计系统(程序+Lw)

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. 数据统计之用户总量统计

    数据统计 在进入到后台页面后,首先我们需要完成如下功能: 1.用户总数统计 2.日增用户统计 3.日活用户统计 4.下单用户统计 5.月新增用户统计 6.商品访问量统计 [将所有的业务逻辑的代码都放在 ...

  10. 个推数据统计产品(个数)iOS集成实践

    2019独角兽企业重金招聘Python工程师标准>>> 最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据.这次我们尝试使用的是个推(之前专门做消息推送的)旗下新 ...

最新文章

  1. JAVA springboot微服务b2b2c电子商务系统(十三)断路器聚合监控(Hystrix Turbine)
  2. YY的GCD 莫比乌斯反演
  3. 共享一个调用微信公众平台接口的客户端类库
  4. window docker mysql_windows使用docker运行mysql等工具(二)安装运行mysql
  5. 【CodeForces - 892C 】Pride (数学,思维构造,gcd)
  6. iOS项目开发优秀文章汇总
  7. UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
  8. matplotlib显示图中标签
  9. Android获取状态栏和标题栏的高度
  10. 3dmax疯狂模渲大师软件有什么使用指南?疯狂模渲大师的目录,教你怎么使用疯狂模渲大师,疯狂模渲大师其实并不难!
  11. 电力系统绝缘配合方法
  12. Button按钮及其点击事件方式
  13. 深度学习常用显卡比较
  14. 零基础使用vscode实现python爬取高德地铁数据
  15. linux上运行gfortran,linux下gfortran 生成so文件
  16. shell-脚本入门
  17. 计算机毕业设计ssm文学阅读平台
  18. compiti delle vacanze 暑假作业
  19. 蓝桥杯 提高题 母牛的故事
  20. 搭建pxe远程安装服务器

热门文章

  1. 行!20周年,这下我们玩大了!粉丝:太良心
  2. 树莓派搭建智能家庭系统(前言)
  3. JavaScript制作轮盘
  4. 在wsl ubuntu18.04 上安装 Jenkins
  5. 利用FME生成3D室内导航网络数据
  6. xctf攻防世界 MISC高手进阶区 奇怪的TTL字段
  7. aio_pika篇---实现收发功能
  8. Banner的设计过程
  9. Shp文件建城区斑块的消除、合并、缓冲区
  10. 3D打印房子来了 20小时造一栋楼!