一.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的更多相关文章

  1. django中使用redis保存session(转)

    原文:https://blog.csdn.net/Enjolras_fuu/article/details/79661582 Django-redis-session官网:https://pypi.o ...

  2. 用Python来操作redis 以及在Django中使用redis

    什么是Redis? Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值可以包 ...

  3. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  4. Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付

    一:redis连接池, 二:redis-list操作, 三:django中使用redis, 四:支付宝支付

  5. python连接redis、redis字符串操作、hash操作、列表操作、其他通用操作、管道、django中使用redis

    今日内容概要 python连接redis redis字符串操作 redis之hash操作 redis之列表操作 redis其他 通用操作,管道 django中使用redis 内容详细 1.python ...

  6. Django中的cookie与session

    cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

  7. Django中的cookie和session

    前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...

  8. 【转】Django中的cookie与session

    转自:https://www.cnblogs.com/chenchao1990/p/5283725.html cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空 ...

  9. 如何使用django中的cookie和session?

    1.Cookie 介绍 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Co ...

随机推荐

  1. Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战

    一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...

  2. Spring boot 全局配置文件application.properties

    #更改Tomcat端口号 server.port=8090 #修改进入DispatcherServlet的规则为:*.htmlserver.servlet-path=*.html#这里要注意高版本的s ...

  3. python学习笔记(9)--函数

    函数定义: def <函数名>(<参数(0个或多个)>): 函数体 return <返回值> 参数有非可选参数,和可选参数,可选参数放在参数列表的最后,可以为可选参 ...

  4. debug方法

    debug as -> spring boot->开始了 可以添加 ,, 来进行向下步骤:使用其他方法(在方法内打点) 一步步F6就可以了

  5. 一、linux扩展

    1.linux-解压bz2文件提示tar (child): bzip2: Cannot exec: No such file or directory 原因,linux下没有bzip2解压工具 安装b ...

  6. 不幸,我的Ryzen 7 1700X中招了,也有segfault

    在历经了I7-5775C,I7-5820K之后,决定尝鲜用一下为AMD漂亮翻身的Ryzen 7,海淘了一颗Ryzen 7 1700X 最近听说在极重负载的情况下,CPU会出错,于是从网上找来Kill- ...

  7. 使用Spring的@Scheduled实现定时任务参数详解

    Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocati ...

  8. 趣味网站5个,小鸡词典/中国配色/名著地图/海洋之音/LOGO设计

    一.小鸡词典 很多流行的词语还没有收录到各大词典,却可以在小鸡词典搜索到,小鸡词典是最全的网络流行词语词典. 不少词条搞笑无厘头,撰写词条还会获得红包. 访问地址:https://jikipedia. ...

  9. Hibernate中的Entity类之间的继承关系之一MappedSuperclass

    在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...

  10. 通过JPA注解获取某个类的主键字段

    public String getPkColumn(String className) { String pkColumn = null; try { Class clazz = Class.forN ...