在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 ...
随机推荐
- windos安装maven
1.下载好maven压缩包,并解压到相应位置,本次安装在D: 2.配置环境变量 MAVEN_HOME=D:\apache-maven-3.0.5 path=%MAVEN_HOME% 3.生成maven ...
- 记一次阿里云服务器被用作DDOS攻击肉鸡
事件描述:阿里云报警 ——检测该异常事件意味着您服务器上开启了"Chargen/DNS/NTP/SNMP/SSDP"这些UDP端口服务,黑客通过向该ECS发送伪造源IP和源端口的恶 ...
- Java语言支持的3种变量类型
类变量(静态变量):独立于方法之外的变量,用 static 修饰. 实例变量(全局变量):独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量. 例子如下: public ...
- layui tips
- Lodop打印控件 打印透明图问题
Lodop通过增设transcolor属性实现了“先字后章”效果,这个属性可以把某种颜色转成类似透明的效果.例如:把图章的底色白色变成透明:transcolor="#FFFFFF" ...
- openblas下载安装编译
编译好的库: https://github.com/JuliaLinearAlgebra/OpenBLASBuilder/releases 源码编译 下载:https://github.com/xia ...
- hibernate主配置文件中指定session与当前线程绑定
配置一条属性 <property name="hibernate.current_session_context_class">thread</property& ...
- nginx-添加禁止访问规则
location ~* /application/(admin|index)/static/.*$ { allow all; } location ~* /(applicaion|addos|coe| ...
- Codeforces Round #472 Div. 1
A:某个格子被染黑说明该行和该列同时被选中,使用并查集合并,最后看每个集合中是否有未被染黑的格子即可. #include<iostream> #include<cstdio> ...
- 水课 or not
很不幸,这学期的毛概老师是个老古董,讲的内容也甚是枯燥和迂腐,个人角度是不太喜欢.然而这也仅仅是站在个人感性的角度,唏嘘一下也就够了.听不下去了,写点东西. 有时候会想,是不是随着自己长大,渐渐地对专 ...