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多线程threading.Lock锁用法实例
Nov 01 Python
python多进程操作实例
Nov 21 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
python绘制简单折线图代码示例
Dec 19 Python
Python装饰器知识点补充
May 28 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
学习Django知识点分享
Sep 11 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
Oct 27 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
python实现人工蜂群算法
Sep 18 Python
Python制作表白爱心合集
Jan 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
php str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
python把1变成01的步骤总结
2019/02/27 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
团日活动总结范文
2014/04/25 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
创业计划书介绍
2019/04/24 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
Nginx报404错误的详细解决方法
2022/07/23 Servers