在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"]=""
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=="":
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":["导入你写的认证类",]
}
在django中使用Redis存取session的更多相关文章
- django中使用redis保存session(转)
原文:https://blog.csdn.net/Enjolras_fuu/article/details/79661582 Django-redis-session官网:https://pypi.o ...
- 用Python来操作redis 以及在Django中使用redis
什么是Redis? Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值可以包 ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付
一:redis连接池, 二:redis-list操作, 三:django中使用redis, 四:支付宝支付
- python连接redis、redis字符串操作、hash操作、列表操作、其他通用操作、管道、django中使用redis
今日内容概要 python连接redis redis字符串操作 redis之hash操作 redis之列表操作 redis其他 通用操作,管道 django中使用redis 内容详细 1.python ...
- Django中的cookie与session
cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...
- Django中的cookie和session
前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...
- 【转】Django中的cookie与session
转自:https://www.cnblogs.com/chenchao1990/p/5283725.html cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空 ...
- 如何使用django中的cookie和session?
1.Cookie 介绍 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Co ...
随机推荐
- ubunto启动chrome报错
/usr/bin/google-chrome-stable[5199:5199:0703/143543.136117:ERROR:zygote_host_impl_linux.cc(88)] Runn ...
- ES6 & Map & hashMap
ES6 & Map & hashMap 01 two-sum https://leetcode.com/submissions/detail/141732589/ hashMap ht ...
- [SimplePlayer] 实现一个简单的播放器
简单的播放器需要实现一个最基本的功能:播放视频文件. 实现这个功能需要包含以下几个步骤: 从视频文件中提取视频图像 在屏幕上显示视频图像 视频帧的同步,也就是保证视频图像在合适的时间在屏幕上显示 从视 ...
- P1216 数字三角形
题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 ...
- 前端 -- CSS基础
一,CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). 二,CSS语法 1 ...
- Tmutarakan Exams URAL - 1091(莫比乌斯函数 || 容斥)
题意: 求1 - s 中 找出k个数 使它们的gcd > 1 求这样的k个数的对数 解析: 从每个素数的倍数中取k个数 求方案数 然后素数组合,容斥一下重的 奇加偶减 莫比乌斯函数的直接套模 ...
- 全局最小割Stoer-Wagner算法
借鉴:http://blog.kongfy.com/2015/02/kargermincut/ 提到无向图的最小割问题,首先想到的就是Ford-Fulkerson算法解s-t最小割,通过Edmonds ...
- django 配置邮件发送 send_email
导入 send_email 所用方法导入 from django.core.mail import send_mail 因为使用的需要指明 发送人 所以要把 setting.py 中的 EMAIL_F ...
- Min_25 筛小结
Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...
- BZOJ1095 [ZJOI2007] Hide 捉迷藏 (括号序列 + 线段树)
题意 给你一颗有 \(n\) 个点的树 , 共有 \(m\) 次操作 有两种类别qwq 将树上一个点染黑/白; 询问树上最远的两个黑点的距离. \((n \le 200000, m ≤500000)\ ...