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实现的百度站长自动URL提交小工具
Jun 27 Python
Python中itertools模块用法详解
Sep 25 Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
Python编写电话薄实现增删改查功能
May 07 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
Python实现的计算器功能示例
Apr 26 Python
python实现石头剪刀布程序
Jan 20 Python
python实现杨氏矩阵查找
Mar 02 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
简单了解Python变量作用域正确使用方法
Jun 12 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
细说NumPy数组的四种乘法的使用
Dec 18 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
JS表的模拟方法
2015/02/05 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
Python利用ansible分发处理任务
2015/08/04 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
三好学生自我鉴定
2013/12/17 职场文书
学校卫生检查制度
2014/02/03 职场文书
小学社会实践活动总结
2014/07/03 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
Mysql案例刨析事务隔离级别
2021/09/25 MySQL