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 相关文章推荐
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
python简单程序读取串口信息的方法
Mar 13 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
实例讲解Python中函数的调用与定义
Mar 14 Python
Python实现的简单dns查询功能示例
May 24 Python
Python利用turtle库绘制彩虹代码示例
Dec 20 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
python中退出多层循环的方法
Nov 27 Python
Python使用python-docx读写word文档
Aug 26 Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 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配置文件httpd.conf的部分参数说明
2013/06/28 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
Python断言assert的用法代码解析
2018/02/03 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
python中class的定义及使用教程
2019/09/18 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
python range实例用法分享
2020/02/06 Python
Python图像读写方法对比
2020/11/16 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
德国自行车商店:Tretwerk
2019/06/21 全球购物
酒店员工培训方案
2014/06/02 职场文书
空气的环保标语
2014/06/12 职场文书
师范类求职信
2014/06/21 职场文书
2014年国庆标语
2014/06/30 职场文书
云冈石窟导游词
2015/02/04 职场文书
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android