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选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
Python使用turtule画五角星的方法
Jul 09 Python
python中的错误处理
Apr 10 Python
python学习 流程控制语句详解
Jun 01 Python
python添加模块搜索路径方法
Sep 11 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python字符串格式化方式解析
Oct 19 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
Django 项目布局方法(值得推荐)
Mar 22 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 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
apache php mysql开发环境安装教程
2016/07/28 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
js常用函数 不错
2006/09/08 Javascript
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
豆瓣网的jquery代码实例
2008/06/15 Javascript
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
Vue自定义指令写法与个人理解
2019/02/09 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
python 两种方法删除空文件夹
2020/09/29 Python
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
历史学专业个人的自我评价
2013/10/13 职场文书
高中生自我鉴定范文
2013/10/30 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
写给老师的感谢信
2015/01/20 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
2016年情人节问候语
2015/11/11 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
MySQL 开窗函数
2022/02/15 MySQL
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript