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 随机生成中文验证码的实例代码
Mar 20 Python
Python3.x中自定义比较函数
Apr 24 Python
Python列表解析配合if else的方法
Jun 23 Python
python绘制散点图并标记序号的方法
Dec 11 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
Python控制Firefox方法总结
Jun 03 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
python实现在线翻译功能
Mar 03 Python
django美化后台django-suit的安装配置操作
Jul 12 Python
python实现经典排序算法的示例代码
Feb 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 替换模板变量实现步骤
2009/08/24 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
python程序封装为win32服务的方法
2021/03/07 Python
python的slice notation的特殊用法详解
2019/12/27 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
公务员更新知识培训实施方案
2014/03/31 职场文书
春节晚会开场白
2015/05/29 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
详解Python牛顿插值法
2021/05/11 Python