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 12 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
matplotlib作图添加表格实例代码
Jan 23 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
在django中图片上传的格式校验及大小方法
Jul 28 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
python获取响应某个字段值的3种实现方法
Apr 30 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 Python
python xlsxwriter模块的使用
Dec 24 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
python实现简单的井字棋
May 26 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简单静态页生成过程
2008/03/27 PHP
PHP 函数语法介绍一
2009/06/14 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
php银联网页支付实现方法
2015/03/04 PHP
利用php输出不同的心形图案
2016/04/22 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
Python中pillow知识点学习
2018/04/30 Python
Python实现DDos攻击实例详解
2019/02/02 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
Python使用type动态创建类操作示例
2020/02/29 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
荷兰电脑专场:Paradigit
2018/05/05 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
《倍数和因数》教学反思
2016/02/23 职场文书
MongoDB支持的索引类型
2022/04/11 MongoDB