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 多线程应用介绍
Dec 19 Python
python自然语言编码转换模块codecs介绍
Apr 08 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
wxPython实现整点报时
Nov 18 Python
python分布式计算dispy的使用详解
Dec 22 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
python zip()函数的使用示例
Sep 23 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 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中读取和写入WORD文档的代码
2008/04/09 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
js输出列表实现代码
2010/09/12 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
简析Python的闭包和装饰器
2016/02/26 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
运动会100米解说词
2014/01/23 职场文书
学生会干部自荐信
2014/02/04 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
离婚协议书的范本
2015/01/27 职场文书
公司慰问信范文
2015/03/23 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
工作后的感想
2015/08/07 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
python用tkinter开发的扫雷游戏
2021/06/01 Python
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers
德生2P3收音机开箱评测
2022/04/30 无线电