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编程入门之Hello World的三种实现方式
Nov 13 Python
Python文件操作之合并文本文件内容示例代码
Sep 19 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
简单了解Python3里的一些新特性
Jul 13 Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 Python
如何学习Python time模块
Jun 03 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
Django实现内容缓存实例方法
Jun 30 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
python opencv实现简易画图板
Aug 27 Python
详解Python自动化之文件自动化处理
Jun 21 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+javascript实现二级级联菜单的制作
2008/05/06 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
php验证手机号码
2015/11/11 PHP
php源码的使用方法讲解
2019/09/26 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
Python中变量交换的例子
2014/08/25 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
计算机本科生自荐信
2013/10/15 职场文书
初中地理教学反思
2014/01/11 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
军训口号
2014/06/13 职场文书
结婚保证书
2015/01/16 职场文书
党员年终个人总结
2015/02/14 职场文书
深入解析MySQL索引数据结构
2021/10/16 MySQL
Python常遇到的错误和异常
2021/11/02 Python