Django rstful登陸認(rèn)證并檢查session是否過(guò)期代碼實(shí)例
這篇文章主要介紹了Django rstful登陸認(rèn)證并檢查session是否過(guò)期代碼實(shí)例,下面我們可以來(lái)一起學(xué)習(xí)一下。
一:restful用戶(hù)視圖
#!/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('該賬號(hào)已經(jīng)被注冊(cè)')
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('用戶(hù)名或密碼錯(cuò)誤')
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是否過(guò)期
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('非法用戶(hù),拒絕訪問(wèn)')
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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Python實(shí)現(xiàn)在線加密解密網(wǎng)站系統(tǒng)
在這個(gè)數(shù)字化時(shí)代,數(shù)據(jù)的安全和隱私變得越來(lái)越重要,所以本文小編就來(lái)帶大家實(shí)現(xiàn)一個(gè)簡(jiǎn)單但功能強(qiáng)大的加密解密系統(tǒng),并深入探討它是如何工作的,有興趣的可以了解下2023-09-09
jenkins配置python腳本定時(shí)任務(wù)過(guò)程圖解
這篇文章主要介紹了jekins配置python腳本定時(shí)任務(wù)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
python線程優(yōu)先級(jí)隊(duì)列知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的一篇關(guān)于python線程優(yōu)先級(jí)隊(duì)列知識(shí)點(diǎn)總結(jié),有興趣的朋友們可以學(xué)習(xí)參考下。2021-02-02
python爬蟲(chóng) 貓眼電影和電影天堂數(shù)據(jù)csv和mysql存儲(chǔ)過(guò)程解析
這篇文章主要介紹了python爬蟲(chóng) 貓眼電影和電影天堂數(shù)據(jù)csv和mysql存儲(chǔ)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
python+flask實(shí)現(xiàn)API的方法
這篇文章主要為大家詳細(xì)介紹了python+flask實(shí)現(xiàn)API的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
python3中calendar返回某一時(shí)間點(diǎn)實(shí)例講解
在本篇內(nèi)容里小編給大家整理了關(guān)于python3中calendar返回某一時(shí)間點(diǎn)實(shí)例講解內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。2020-11-11
Python爬蟲(chóng)突破反爬蟲(chóng)機(jī)制知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于Python爬蟲(chóng)突破反爬蟲(chóng)機(jī)制知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-11-11

