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提取字典key列表的方法
Jul 11 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
简单分析python的类变量、实例变量
Aug 23 Python
Python配置文件处理的方法教程
Aug 29 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
python3 sqlite3限制条件查询的操作
Apr 07 Python
分享Python异步爬取知乎热榜
Apr 12 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中如何实现常用邮箱的基本判断
2014/01/07 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
人事专员的岗位职责
2014/03/01 职场文书
观看信仰心得体会
2014/09/04 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
业务员岗位职责范本
2015/04/03 职场文书
河童之夏观后感
2015/06/11 职场文书
教师个人教学反思
2016/02/23 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书