Django rstful登陆认证并检查session是否过期代码实例


Posted in Python onAugust 13, 2019

这篇文章主要介绍了Django rstful登陆认证并检查session是否过期代码实例,下面我们可以来一起学习一下。

一:restful用户视图

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
# Author:Leslie-x
from users import models
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets
from rest_framework import serializers
from django.contrib.auth import authenticate, login, logout
class UserSerializer(serializers.ModelSerializer):
  class Meta:
    model = models.User
    exclude = ('password',)
class UserViewSet(viewsets.ReadOnlyModelViewSet):
  serializer_class = UserSerializer
  queryset = User.objects.all()
  authentication_classes = (UserAuthentication,)

  @action(detail=False, methods=['post'])
  def register(self, request, *args, **kwargs):
    username = request.data.get("username")
    queryset = User.objects.filter(username=username)
    if queryset.exists():
      raise exceptions.PermissionDenied('该账号已经被注册')
    user = User.objects.create_user(**request.data)
    UserProfile.objects.create(user=user, nickname=user.username)
    data = self.get_serializer(user).data
    return Response(data)

  @action(detail=False, methods=['post'])
  def login(self, request, *args, **kwargs):
    username = request.data.get("username")
    password = request.data.get("password")
    user = authenticate(username=username, password=password)
    if not user:
      raise exceptions.PermissionDenied('用户名或密码错误')
    auth_id = request.session.get('_auth_user_id')
    if auth_id != str(user.pk):
      logout(request)
    login(request, user)
    data = self.get_serializer(user).data
    data['session_key'] = request.session.session_key
    return Response(data)

  @action(detail=False, methods=['post'])
  def logout(self, request, *args, **kwargs):
    logout(request)
    return Response()

二:检查session是否过期

from rest_framework.authentication import SessionAuthentication
from rest_framework.request import Request
from django.contrib.sessions.models import Session
from rest_framework import exceptions
import arrow
class CustomAuth(SessionAuthentication):
  def check_session(self, request):
    session_key = request.session.session_key
    queryset = Session.objects.filter(session_key=session_key)
    if not queryset.exists():
      raise exceptions.PermissionDenied('非法用户,拒绝访问')
    expire_date = queryset.first().expire_date
    now = arrow.now().format('YYYY-MM-DD HH:mm:ss')
    if not arrow.get(now) < arrow.get(expire_date):
      raise exceptions.PermissionDenied('session expired')

  def authenticate(self, request: Request):
    ret = super().authenticate(request)

 self.check_session(request)


 return ret

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现监控linux性能及进程消耗性能的方法
Jul 25 Python
Python获取文件ssdeep值的方法
Oct 05 Python
python简单获取数组元素个数的方法
Jul 13 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
Oct 22 Python
解决python xlrd无法读取excel文件的问题
Dec 25 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
python定时截屏实现
Nov 02 Python
Opencv python 图片生成视频的方法示例
Nov 18 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 #Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 #Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 #Python
Python字符串处理的8招秘籍(小结)
Aug 13 #Python
python实现批量修改服务器密码的方法
Aug 13 #Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 #Python
Python实现微信翻译机器人的方法
Aug 13 #Python
You might like
国内咖啡文化
2021/03/03 咖啡文化
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python分布式编程实现过程解析
2019/11/08 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
语文教育专业应届生求职信
2013/11/23 职场文书
生日寄语大全
2014/04/08 职场文书
公司募捐倡议书
2014/05/14 职场文书
工地质量标语
2014/06/12 职场文书
2015元旦感言
2015/12/09 职场文书
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android