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完全新手教程
Feb 08 Python
python模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
详细介绍Python函数中的默认参数
Mar 30 Python
浅谈Python程序与C++程序的联合使用
Apr 07 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
python之django母板页面的使用
Jul 03 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
python 递归调用返回None的问题及解决方法
Mar 16 Python
简单了解Python多态与属性运行原理
Jun 15 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
PHP HTML代码串 截取实现代码
2009/06/29 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
PHP导入导出Excel代码
2015/07/07 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
PHP7 弃用功能
2021/03/09 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
比驿:全球酒店比价网
2018/06/20 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
讲座主持词
2014/03/20 职场文书
汽车转让协议书范本
2014/12/07 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
JavaScript的Set数据结构详解
2022/02/18 Javascript