Django rstful登陆认证并检查session是否过期代码实例
作者:Leslie-x 发布时间:2022-11-04 16:17:15
标签:django,rstful,登陆,认证,检查,session,过期
这篇文章主要介绍了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
来源:https://www.cnblogs.com/li1992/p/10388501.html


猜你喜欢
- 操作方法如下所示:File-->Settings-->Editor-->Color&Fonts-->Lang
- 使用smtplib模块发送邮件,供大家参考,具体内容如下1)使用smtplib模块发送简单邮件步骤:1.连接SMTP服务器,并使用用户名、密
- Django的数据库层从Python代码生成SQL schemas—但是对于遗留数据库,你已经拥有SQL schemas. 这种情况,你需要
- 一、什么是requirements.txt文件及作用requirements.txt 文件是项目的依赖包及其对应版本号的信息列表,即记载你这
- 当我们在使用Pycharm时,总是会建立多个项目文件,但是分别打开每个项目文件会很麻烦,接下来看在Project Files下如何创建多个项
- text-overflow这个属性真让Firefox折腾,虽然之前有写过Firefox通过XUL实现text-overflow:ellips
- 如下所示: static void Main()&nbs
- python 的虚拟环境可以为一个 python 项目提供独立的解释环境、依赖包等资源,既能够很好的隔离不同项目使用不同 python 版本
- 简介在某些场景下,我们需要初始化一些资源,例如单例对象、配置等。实现资源的初始化有多种方法,如定义 package 级别的变量、在 init
- 今天做自定义的404页面,需要垂直水平居中,垂直居中不像水平居中那么简单,呵呵。这种效果会在企业站首页,或一些提示性页面经常用到,今天做了个
- 例1、一个简单存储过程游标实例DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$CRE
- 问题:在Jupyter Notebook中使用args传递参数时出现错误:原始代码:args = parser.parse_args()us
- 简介Pycharm安装以后必须激活后,才能正常的使用。否则就不能使用。激活PyCharm1、Activation code激活优点:Wind
- MySQLTuner 下载地址:http://github.com/rackerhacker/MySQLTuner-perlMySQLTun
- 现在有越来越多的个人主页站长需要了解如何如何在windows系统下配置自己的php,cgi服务器,以方便本地调试cgi和php的程序。我们可
- 最简单的模式,C/S模式实现聊天室从半双工开始,何谓半双工?半双工即是说双方可以互发消息,但一次只能一个用户发送。 只要稍微会点s
- 学习一些你已经知道的知识也没有什么坏处,是吧?我知道这可能并不一定非常有意义,但是很多时候我们往往知其然而不知其所以然,这会使得事情出现惊人
- 简介memory_profiler是第三方模块,用于监视进程的内存消耗以及python程序内存消耗的逐行分析。它是一个纯python模块,依
- python是一种跨平台的计算机程序设计语言。python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,可以应用于科学计算
- golang sort package: https://studygolang.com/articles/3360sort 操作的对象通常