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-itchat 获取微信群用户信息的实例
Feb 21 Python
Python中Numpy mat的使用详解
May 24 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 Python
python 批量压缩图片的脚本
Jun 02 Python
Python中Selenium对Cookie的操作方法
Jul 09 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 设置MySQL连接字符集的方法
2011/01/02 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
初识javascript 文档碎片
2010/07/13 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
Python中atexit模块的基本使用示例
2015/07/08 Python
python实现中文分词FMM算法实例
2015/07/10 Python
python 读取文件并替换字段的实例
2018/07/12 Python
Python docx库用法示例分析
2019/02/16 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
大专生的学习自我评价
2013/12/04 职场文书
英文慰问信范文
2015/03/24 职场文书
信仰纪录片观后感
2015/06/08 职场文书
公司欠款证明
2015/06/24 职场文书
2016元旦晚会主持词
2015/07/01 职场文书