在django中使用Redis訪問session

2022-05-29 05:48:09 字數 4661 閱讀 6748

1.django的快取配置

#

redis在django中的配置

caches =

#"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

urlfrom 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=100self.msg=none

@property

defget_dic(self):

return self.__dict__

class

setsession(apiview):

#設定session,直接request.session就自動把session值儲存到redis中了

defpost(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的值

defget(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請求

需要聯合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):

defauthenticate(self, request):

token=request.get.get("

token")

#從redis中取出token,前提是已經在settings中配置redis

user=cache.get(token)

ifuser:

return

user,token

token = models.token.objects.filter(key=token).first()

iftoken:

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=100self.msg=none

@property

defget_dic(self):

return self.__dict__

class

login(apiview):

defpost(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)

ifuser:

token=uuid4()

try:

models.token.objects.update_or_create(user=user,defaults=)

#將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 =

Django中使用Redis快取

目錄memecache 資料操作 特點 1.依賴 pip install redis2.直接使用 import redis r redis.redis host 127.0.0.1 port 6379,db 1 3.連線池使用 import redis pool redis.connectionpo...

在Django中使用DISTINCT

有時候想用distinct去掉queryset中的重複項,看django文章中是這麼說的 author.objects.distinct entry.objects.order by pub date distinct pub date entry.objects.order by blog dis...

在django中使用logging

django中似乎沒有專門支援logging的module。想在自己開發程式中使用一下log功能,記錄訪問情況,和輸入debug的一些資訊。於是google到一段 使用的python的標準庫logging,目前工作還算正常.url import logging import threading fr...