主要内容:http://www.cnblogs.com/maple-shaw/articles/7563029.html

1 缓存: 把数据存在某个地方, 下次再读取的时候不用再去原位置读取

    缓存即是将一个某个views的返回值保存至内存或者是memcache中, 在你所设置的时间内, 如果有人再来访问的时候, 则不会再执行view中的操作, 而是直接从内存或者memcache中之前的缓存的内容中拿到.

  jango提供的六种缓存方式: 见老师博客:

  1: 缓存应用在视图中:  粒度适中

    先在settings中设置

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache','LOCATION': 'unique-snowflake','TIMEOUT': 300,  # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)'OPTIONS': {'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)},}
}

    2 接着写url, 视图函数, HTML文件

from django.views.decorators.cache import cache_page
@cache_page(15)
def user_list(request):print('this is user')all_user = models.User.objects.all()return render(request, 'user.html', {'all_user': all_user})

    结论: 在15 秒之内访问该视图, 直接从缓存中取值, 不走数据库, 提高效率

  2 缓存在文件中

    1 settings里的配置, views里不变

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': 'C:\cache' ,'TIMEOUT': 300,  # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)'OPTIONS': {'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)},}
}

  3 全站应用:  力度最大

    setings里的配置:

MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware',# 其他中间件...'django.middleware.cache.FetchFromCacheMiddleware',]

    

  4 局部应用: 粒度最细

    用法:  先在模板中{% load cache%}

        使用缓存: {% cache 5 '随意的字符串'%}缓存内容{%endcache%}

    视图中的用法:

# 局部应用缓存
# 此时应该把中间件中的全站的应用给注销掉
def user_list(request):now = time.time()all_user = models.User.objects.all()return render(request, 'user.html', {'all_user': all_user, 'now': now})

    模板中的用法:

<body>
{{ now }}
<ul>{% cache 5 'asss' %}{{ now }}{% for user in all_user %}<li>{{ user.name }}-{{ user.age }}</li>{% endfor %}{% endcache %}
</ul>
</body>

2  序列化:关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。

  1 , serializes

from django.core import serializers
# def user_list(request):
#     now = time.time()
#     all_user = models.User.objects.all()
#     print(all_user)
#     # <QuerySet [<User: User object>, <User: User object>, <User: User object>]>
#     data = serializers.serialize('json', all_user)
#     print('this si 序列化的结果', data)
#     #  [{"model": "app01.user", "pk": 1, "fields": {"name": "\u8bd7\u8bd7", "age": 28}},]

  2 , json.dumps, 由于queryset不支持dumps, 所以转换成list

all_user = models.User.objects.all().values('name')# <QuerySet [{'name': '诗诗'}, {'name': '菲菲'}, {'name': '圆圆'}]>all_user1 = models.User.objects.all().values_list('name')ret = list(all_user1)# 把ret转换成列表# [('诗诗',), ('菲菲',), ('圆圆',)]result = json.dumps(ret)print(result)# <QuerySet [('诗诗',), ('菲菲',), ('圆圆',)]>

 3 , 由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:

import json
from datetime import datetime, date
data = [{"pk": 1, "name": "\u83b9\u83b9", "age": 18, 'birth': datetime.now()},{"pk": 2, "name": "\u5c0f\u5fae", "age": 16, 'birth': datetime.now()},{"pk": 3, "name": "\u5c0f\u9a6c\u54e5", "age": 8, 'birth': datetime.now()},{"pk": 4, "name": "qqq", "age": 5, 'birth': datetime.now()},{"pk": 5, "name": "www", "age": 5, 'birth': datetime.now()}
]# 由于日期类型不支持json序列化, 所以自定义类来扩展:
class JsonCustomEncoder(json.JSONEncoder):def default(self, field):if isinstance(field, datetime):return field.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(field, date):return field.strftime('%Y-%m-%d')else:return json.JSONEncoder.default(self, field)
print(json.dumps(data, cls=JsonCustomEncoder))

3 信号:Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

  1 : jango的内置信号,见老师博客

  2 : 用法:对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:注册信号,写入与project同名的文件夹下的_init_.py文件中,也是换数据库引擎的地方。

from django.db.models.signals import pre_save, post_save
# 方法一
def callback(sender, **kwargs):print("xxoo_callback")print(sender, kwargs)
post_save.connect(callback)

  3 在创建对象的时候, 自动触发注册函数

def get_value(request):# users = models.User.objects.all().values('pk', 'name', 'age')users = models.User.objects.create(name='ale', age=12)# ret = serializers.serialize('json', users)# ret = serializers.serialize('json', users)return HttpResponse('ok')
#  触发显示的内容:
# xxoo_callback
# <class 'app01.models.User'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000026D2F38F898>, 'instance': <User: User object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

   自定义信号见老师博客

4  验证码:

  1 生成随机验证码:

import randomfrom PIL import Image, ImageDraw, ImageFontdef random_color():return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)def code():with open('1.png', 'wb') as f:img_obj = Image.new('RGB', (250, 35), random_color())# 在该图片对象上生成一个画笔对象draw_obj = ImageDraw.Draw(img_obj)font_obj = ImageFont.truetype('static/font/kumo.ttf', 28)temp = []for i in range(5):l = chr(random.randint(97, 122))  # 小写字母b = chr(random.randint(65, 90))  # 大写字母n = str(random.randint(0, 9))t = random.choice([l, b, n])temp.append(t)# 加线draw_obj.text((i * 40 + 35, 0), t, fill=random_color(), font=font_obj)img_obj.save(f)code()

  

  

  

转载于:https://www.cnblogs.com/gyh412724/p/9918063.html

85 缓存, 验证码 序列化相关推荐

  1. web自动化Python获取Redis缓存验证码

    在进行UI自动化测试过程中,有些情况下登录可能需要进行验证码验证 自动化测试中图片验证码是一个很常见的问题,解决的方法也有很多,比如: 使用OCR识别的技术,对验证码的图片进行字符识别 让开发提供一个 ...

  2. SpringSecurity OAuth2实现单点登录,微信扫码登录,Redis缓存验证码---入门到实战

    1. 认证授权 1.1 什么是认证授权 ​ 例如课程发布后用户通过在线学习页面点播视频进行学习.如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么时间学习什 ...

  3. SpringBoot高级-缓存-RedisTemplate序列化机制

    前面我们就搭建测试好了redis环境,接下来我们就来整合redis来做缓存,我们需要引入redis的starter,这个starter我们直接去官方文档去搜索就行了,我们来找到所有的starter跟r ...

  4. Django 缓存、序列化、信号

    一,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcac ...

  5. Python自动获取Redi缓存验证码

    最近做UI自动化测试,登录是需要进行短信验证码验证,和开发聊了聊思路,就开始着手实施 打开cmd 安装redis库 pip install redis 安装完成后,开始写代码,因为是测试环境,Redi ...

  6. java如何缓存验证码图片_图片验证码概述及实现步骤

    一. 图片验证码概述: 很多网站都有该实现 作用: 为了提高系统的安全性 有了验证码,我们就可以要求用户在输入用户名,密码等信息后,同时输入图片上的文字,用户提交后,系统会首先从session中提取刚 ...

  7. vue+springboot+阿里云短信服务(集成redis实现验证码登录业务)

    阿里云短信服务-介绍 阿里云短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力.调用API或用群发助手,即可发送验证码.通知类和营销类短信:国内验 ...

  8. 【认证服务】验证码、社交登录、分布式session、单点登录

    [认证服务]验证码.社交登录.分布式session.单点登录 目录 [认证服务]验证码.社交登录.分布式session.单点登录 认证服务 一.gulimall-auth-server 二.验证码注册 ...

  9. Gateway + Redis整合Kaptcha验证码

    引言 验证码的作用: 防止自动化代码(爬虫,恶意脚本)来直接发送请求 确认用户信息的真实性 1. pom依赖 <dependency><groupId>org.springfr ...

  10. 4.Spring Security 添加图形验证码

    添加验证码大致可以分为三个步骤:根据随机数生成验证码图片:将验证码图片显示到登录页面:认证流程中加入验证码校验.Spring Security的认证校验是由UsernamePasswordAuthen ...

最新文章

  1. NASM学习之Windows下编写16位程序
  2. 用神经网络分类矩阵和矩阵的转置
  3. VS2010(VS2008)下安装配置OpenCV
  4. Spring Cloud中,Eureka常见问题总结
  5. Android中的音乐播放
  6. Visual Studio LightSwitch初体验和定位看法
  7. ABAP的语法高亮是如何在浏览器里显示的
  8. c# winform如何异步不卡界面
  9. activimq java集成_Java消息队列-Spring整合ActiveMq
  10. 浅读《构建之法:现代软件工程》有感
  11. linux添加文件环境变量
  12. SVN教程代码比较(图文教程)
  13. 【技术直通车】使用FME Extension for ArcGIS读取ArcPad AXF文件
  14. 罗技驱动LOGI G Hub永久保存设置(板载模式)
  15. 冷高轮时间王思聪吃热狗windows电脑壁纸下载
  16. 抖音Vlog必备1000+超强Premiere转场特效字幕动画LUT预设PR模板包 V6 (包含音效)
  17. python骰子游戏分析_python知识分解析掷骰子游戏
  18. pc炉石传说显示无法联觉服务器,《炉石传说》酒馆战棋尤朵拉船长怎么玩 尤朵拉船长运营思路一览...
  19. monthCalendar控件改变颜色无变化
  20. 公式不懂也无妨,业务精通才是真正的算法工程师

热门文章

  1. 91位图和bigemap哪个好用
  2. DS4Windows(电脑PS4手柄控制器)v2.2.6 中文版
  3. 计算机传真,电脑收发传真
  4. cad计算机画图标准,CAD画图某些常用尺寸及作图习惯
  5. TCP/IP协议五:HTTP协议详解
  6. Zemax操作24--高斯光束的聚焦和传播
  7. 求2020 CFA二级notes资源,谢谢!
  8. (转)量化投资发展史:野蛮、乱象、科学
  9. Vue打开动态html页面,vue.js中怎么打开新页面?
  10. 设计模式-结构型软件设计模式(二)