---恢复内容开始---

  一.python 使用redis

   1.1 安装 pip install redis

    测试有一些基本的数据类型

import redis
# redis 是一个缓存数据库 # r = redis.Redis(host='127.0.0.1', port=6379)
# 一般采用host与redis 可以不用配置, 用db来选择操作的数据库 # 如:
r = redis.Redis(db=11)
# r.set() 设置值 操作字符串 r.set('name','coco')
print(r.get('name')) # 设置过期时间
# r.setex('age', 5, '18') # 不能一置打开代开 会重新设置
print(r.get('age')) # 5 秒后None

  hset() 哈希字典

# hset
# print(r.get('age')) # 5 秒后None
r.hset('student','name','yye') # name key value 哈希字典的设置值和取值方法
print(r.hget('student','name'))

  zdd() >>>zset() sorted set() 有序集合

# zadd()
# r.zadd('mayup',{'koko':100,'coco':60,'yye':80}) # 有序集合
# print(r.zrange('mayup',0,0)) # 正向取值 [b'coco']
# print(r.zrevrange('mayup',0,0)) # 取得最后一个 [b'koko']

  1.2 redis 建立连接池

    (1)第一种方式

# redis 原生的建立连接池(支持并发)
pool = redis.ConnectionPool(db=12,max_connections=100)
rp = redis.Redis(connection_pool=pool)
rp.set('name','koko')
print(rp.get('name'))

    (2) django 使用redis缓存

  

# 导入测试环境
import os
import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev")
django.setup() from user import models user = models.User.objects.first()
# 测试子自定义序列化类
from rest_framework.serializers import ModelSerializer class UserModelSerializer(ModelSerializer):
class Meta:
model = models.User
fields = ['username', 'password'] user_data = UserModelSerializer(user).data
# print(user_data)
# 原生redis
# import redis
# r = redis.Redis()
# r.set(user.usernaem,user_data) from django.core.cache import cache # >>>
# cache.set() # vdef set(self, name, value, ex=None, px=None, nx=False, xx=False):
# cache.get() # cache 是一个高速缓存器
cache.set(user.username,user_data,5)
res = cache.get(user.username)
print(res, type(res))
# {'username': 'admin', 'password': 'pbkdf2_sha256$1000dcKSQ='}
# <class 'dict'> 序列化成字典的格式进行存储 # 如和进行数据的存储 现在是默认存储到mameche 需要进行配置存储到我们redis 数据库的缓存
# cache比原生的redis 的好处: (1)djano 和drf份序列化结构
# (2) 如果是普通的json格式 我们就序列化成json格式的字符串
# (3)如果是图片的我们通过图片格式度成二进制

  redis实现数据缓存的接口实列

from rest_framework.views import APIView
from .models import User
from utils.response import APIResponse
import re
# 注册逻辑:1.校验手机号是否存在 2.发送验证码 3.完成注册
# 校验手机号
class MobileAPIView(APIView):
def post(self, request, *args, **kwargs):
mobile = request.data.get('mobile')
if not mobile or not re.match(r'^1[3-9]\d{9}$', mobile):
return APIResponse(1, '数据有误')
try:
User.objects.get(mobile=mobile)
return APIResponse(2, '已注册')
except:
return APIResponse(0, '未注册') # 发送验证码
from libs import txsms
from django.core.cache import cache
from settings.const import SMS_EXP, SMS_CACHE_KEY
from .thorttles import SMSRateThrottle
class SMSAPIView(APIView):
# 频率限制
throttle_classes = [SMSRateThrottle]
def post(self, request, *args, **kwargs):
# 1)拿到前台的手机号
mobile = request.data.get('mobile')
if not mobile or not re.match(r'^1[3-9]\d{9}$', mobile):
return APIResponse(2, '数据有误')
# 2)调用txsms生成手机验证码
code = txsms.get_code()
# 3)调用txsms发送手机验证码
result = txsms.send_sms(mobile, code, SMS_EXP // 60)
# 4)失败反馈信息给前台
if not result:
return APIResponse(1, '短信发送失败')
# 5)成功服务器缓存手机验证码 - 用缓存存储(方便管理) - redis
cache.set(SMS_CACHE_KEY % {'mobile': mobile}, code, SMS_EXP)
# 6)反馈成功信息给前台
return APIResponse(0, '短信发送成功') # 注册
from rest_framework.generics import CreateAPIView
from . import serializers
class RegisterCreateAPIView(CreateAPIView):
# queryset = User.objects.filter(is_active=True)
serializer_class = serializers.RegisterModelSerializer # 自定义响应结果
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) # 校验失败就主动抛异常 => 自定义异常结果,配置异常模块
user_obj = serializer.save() # 要自定义入库逻辑,重写create方法
headers = self.get_success_headers(serializer.data)
# 响应结果需要格式化,使用序列化类要提供序列化与反序列化两套规则
return APIResponse(0, 'ok',
results=serializers.RegisterModelSerializer(user_obj).data,
http_status=201,
headers=headers
) # 多方式登录
class LoginAPIView(APIView):
# 1) 禁用认证与权限组件
authentication_classes = []
permission_classes = []
def post(self, request, *args, **kwargs):
# 2) 拿到前台登录信息,交给序列化类,规则:账号用usr传,密码用pwd传 序列化入库 (data=request.data)
user_ser = serializers.LoginModelSerializer(data=request.data)
# 3) 序列化类校验得到登录用户与token存放在序列化对象中
user_ser.is_valid(raise_exception=True)
# 4) 取出登录用户与token返回给前台 反序列化
return APIResponse(token=user_ser.token, results=serializers.LoginModelSerializer(user_ser.user).data) # 手机验证码登录
from rest_framework_jwt.serializers import jwt_payload_handler
from rest_framework_jwt.serializers import jwt_encode_handler class LoginMobileAPIView(APIView):
authentication_classes = []
permission_classes = [] def post(self, request, *args, **kwargs):
# 收机号码这是必填项
mobile = request.data.get('mobile')
# 还有验证码
code = request.data.get('code')
print(code)
# 判断验证是否是有值
if not mobile or not code:
return APIResponse(1, '数据有误')
# 再判断后端生成的验证码是否一致 后端生成 保存在我们的redis 中 安装 settings 进行配置
old_code = cache.get(SMS_CACHE_KEY % {'mobile': mobile}) # 建立缓存
print(old_code)
if code != old_code: # 生成就在redis 中进行缓存 和饿哦们自己输入的是否一样 return APIResponse(1, '验证码错误')
try:
# 登录成功
user = User.objects.get(mobile=mobile)
# 用户生成paylaod
payload = jwt_payload_handler(user)
# 用载荷生成token 登录成功返回token到前端 需要我们浏览器保存token cookies 进行其他需要登录的操作 token = jwt_encode_handler(payload)
return APIResponse(token=token, results=serializers.LoginModelSerializer(user).data)
except:
return APIResponse(1, '用户不存在')

settings  >>>dev开发环境下进行配置

# import logging  测试的话导入一下
# logging.getLogger('django') # 配制redis 缓存是用:需要额外的安装django-redis
# 步骤: (1) 将缓存存储位置配置到redis 中 CACHES = {
'default':{
'BACKEND':'django_redis.cache.RedisCache',
'LOCATION':'redis://127.0.0.1:6379/10',
'OPTIONS':{
'CLIENT_CLASS':'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS':{'max_connections':100} }
} }

  

---恢复内容结束---

redis数据库如何用Django框架缓存数据的更多相关文章

  1. Django框架下数据存储实现时间戳格式存储到数据库2019-12-11 17:53:13

    2019-12-11 17:53:13 models.py class DomainDir(models.Model): date = models.DateTimeField() views.py ...

  2. Window环境下配置Redis服务的方法及查看缓存数据的工具介绍

    工具下载位置:http://pan.baidu.com/s/1hqVh1f2,包括服务端配置以及查看缓存的工具. 服务端是以服务的形式运行,将Redis服务端解压到某个目录,然后执行cmd执行命令: ...

  3. 如何用django框架完整的写一个项目

    实现目标及功能,增删改,并且实现搜索,分页,日期插件,删除提示,以及批量导入等功能 软件版本: python3.5 django1.11 一  用pycharm创建一个项目,名字自定义 二 编辑url ...

  4. Django框架--路由分配系统

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  5. Django框架之ORM对表结构操作

    ORM的优点:(1)简单,不用自己写SQL语句 (2)开发效率高 ORM的缺点:对于不同的人写的代码,执行效率有差别 ORM的对应关系: 类  ---------->  数据表 对象------ ...

  6. 数据库历险记(三) | 缓存框架的连环炮 数据库历险记(二) | Redis 和 Mecached 到底哪个好? 数据库历险记(一) | MySQL这么好,为什么还有人用Oracle? 面对海量请求,缓存设计还应该考虑哪些问题?

    数据库历险记(三) | 缓存框架的连环炮   文章首发于微信公众号「陈树义」,专注于 Java 技术分享的社区.点击链接扫描二维码,与500位小伙伴一起共同进步.微信公众号二维码 http://p3n ...

  7. 第三百一十七节,Django框架,缓存

    第三百一十七节,Django框架,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返 ...

  8. django之缓存的用法, 文件形式与 redis的基本使用

    django的缓存的用法讲解 1. django缓存: 缓存的机制出现主要是缓解了数据库的压力而存在的 2. 动态网站中,用户的请求都会去数据库中进行相应的操作,缓存的出现是提高了网站的并发量 3. ...

  9. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

随机推荐

  1. DH加密算法

    http://blog.csdn.net/zbw18297786698/article/details/53609794

  2. charts_03

    table 数值获取: 1.http://www.w3school.com.cn/jsref/dom_obj_all.asp 2.http://blog.csdn.net/xs_zgsc/articl ...

  3. DeepFaceLab:视频中有多人,仅替换特定人脸的方法!

    DeepFaceLab自带的视频素材,一个是钢铁侠托尼斯塔克,一个是变形金刚男主角山姆.每一个视频中只有一个人.所以当你第一次玩的时候很顺畅,什么都不用管,一步一步按教程来就好好了. ​ 直到有一天你 ...

  4. 考虑以下 Python 代码,如果运行结束,命令行中的运行结果是什么?

    l = [] for i in xrange(10):  l.append({‘num’:i}) print l在考虑以下代码,运行结束后的结果是什么? l = [] a = {‘num’:0} fo ...

  5. RTX系统整合记录

    1.切换数据库RTX常见问题解答五. SQL数据库配置 2.同步系统组织机构 部门同步 用户同步https://blog.csdn.net/qq_21703215/article/details/80 ...

  6. Java程序设计——不一样的开始 IP地址判定

    不一样的开始 其实,写报告,很烦人,但是着实很有用. 报告不但是自己复习回顾的数据库,还是团队合作,技术提高的加速器,认真对待报告,认真对待自己的行业,把他看作自己安身立命的对象. IP地址判定 [问 ...

  7. Solrcloud+tomcat+zookeeper

    准备两台服务器,目录结构如下 主机名 IP地址 tomcat安装路径 zookeeper安装路径 solr安装路径 java安装路径 sht-sgmhadoopnn-01 172.16.101.55 ...

  8. [转帖]什么是 LLVM?Swift, Rust, Clang 等语言背后的支持

    要了解用于以编程方式生成机器原生代码的编译器框架是如何让新语言的推出以及对现有的语言进行增强比以往更加容易了. https://www.oschina.net/translate/what-is-ll ...

  9. java中的小知识点

    1.数据类型的相关知识点 1.1.java内置封装类的转换 java中内置的封装类Byte.Integer.Float.Double和Long都可以转换成double类型的数值:因为这些封装好的类中都 ...

  10. nginx配置本地域名反向代理实现本地多域名80访问

    什么是反向代理? 代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务器处理. 反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器. ...