在django中使用Redis存取session


一.Redis的配置

1.django的緩存配置

# redis在django中的配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "123",
        }
    }
}

2.django中session的配置

# session的存儲配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

# 設置session失效時間,單位為秒
SESSION_COOKIE_AGE = 60*5

配置完這個2個后,在視圖中再設置session,就會自動將session保存在Redis中

二.路由

from django.conf.urls import url
from django.contrib import admin
from api import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^session/$',views.SetSession.as_view() ),
]

三.視圖

這里視圖使用的是MBV,還用了restframework

from rest_framework.views import APIView
# Create your views here.
from rest_framework.response import Response
from api import models


class MyResponse():
    def __init__(self):
        self.status=100
        self.msg=None

    @property
    def get_dic(self):
        return self.__dict__


class SetSession(APIView):
    # 設置session,直接request.session就自動把session值保存到Redis中了
    def post(self,request):
        response = MyResponse()
        request.session["username"]="django"
        request.session["verify_code"]="123"
        response.msg="保存session成功"
        return Response(response.get_dic)

    # 獲取session,直接從request.session中取session的值
    def get(self,request):
        response = MyResponse()
        username_redis=request.session.get("username")
        verify_code_redis=request.session.get("verify_code")
        print(username_redis,verify_code_redis)
        if username_redis=="django" and verify_code_redis=="123":
            response.msg="驗證成功"
            return Response(response.get_dic)
        response.msg="驗證失敗"
        response.status=101
        return Response(response.get_dic)

四.瀏覽器發送請求

這里使用了postman

設置session用了post請求

獲取session用了get請求

 

五.cache組件存取token

需要聯合restframework認證組件一起使用

1.先創建一個認證類

from rest_framework.authentication import BaseAuthentication
from django.core.cache import cache
from api import models
from rest_framework.exceptions import AuthenticationFailed


class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        token=request.GEt.get("token")
        # 從Redis中取出token,前提是已經在settings中配置Redis
        user=cache.get(token)
        if user:
            return user,token
        token = models.Token.objects.filter(key=token).first()
        if token:
            return token.user,token
        else:
            raise AuthenticationFailed("你沒有登入")

2.使用APIView寫登入接口

from rest_framework.views import APIView
from rest_framework.response import Response
from api import models
from django.core.exceptions import ObjectDoesNotExist
from uuid import uuid4
from django.core.cache import cache

class MyResponse():
    def __init__(self):
        self.status=100
        self.msg=None

    @property
    def get_dic(self):
        return self.__dict__

class Login(APIView):
    def post(self,request):
        response = MyResponse()
        name=request.data.get("name")
        pwd=request.data.get("pwd")
        try:
            user=models.UserInfo.objects.filter(username=name,password=pwd).first()
        except ObjectDoesNotExist as e:
            response.msg = "沒有查收到"
            response.status = 101
            return Response(response.get_dic)
        if user:
            token=uuid4()
            try:
                models.Token.objects.update_or_create(user=user,defaults={'key':token})
                # 將token存到Redis中,設置超時時間一天
                cache.set(token, user, 60 * 60 * 24)
                response.msg = '登錄成功'
                response.token = token
                response.name = name
            except ObjectDoesNotExist as e:
                response.msg = "沒有查收到"
                response.status = 101
                return Response(response.get_dic)
        else:
            response.msg = '用戶名或密碼錯誤'
            response.status = 101

        return Response(response.get_dic)

3.最后只要配置需要加登入需求的接口

局部配置:放在視圖函數中

authentication_classes=[LoginAuth]

全局配置:settings中

REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES":["導入你寫的認證類",]
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM