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获取指定网页上所有超链接的方法
Apr 04 Python
python使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
Python使用multiprocessing创建进程的方法
Jun 04 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
pandas.cut具体使用总结
Jun 24 Python
django使用JWT保存用户登录信息
Apr 22 Python
python3排序的实例方法
Oct 20 Python
python实现高效的遗传算法
Apr 07 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使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
python paramiko实现ssh远程访问的方法
2013/12/03 Python
Python实现list反转实例汇总
2014/11/11 Python
Python读写Excel文件方法介绍
2014/11/22 Python
python程序 创建多线程过程详解
2019/09/23 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
信息工作经验交流材料
2014/05/28 职场文书
走群众路线剖析材料
2014/10/09 职场文书
公司委托书格式范文
2014/10/09 职场文书
综治工作汇报材料
2014/10/27 职场文书
员工担保书范本
2015/09/22 职场文书
小学数学教学反思范文
2016/02/16 职场文书
建房合同协议书
2016/03/21 职场文书
物业管理交接协议书
2016/03/24 职场文书
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript