day85- <缓存+序列化+信号+ORM性能相关+随机验证码>

1.缓存

1.缓存的配置,在settings里面,是必定要配置,一共好几种。这个先做个了解

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

2.1对缓存粒度的控制(粒度中等),在视图中

2.2对缓存控制的粒度(粒度最大),在settings中

全站应用: 粒度最大
				MIDDLEWARE = [
					'django.middleware.cache.UpdateCacheMiddleware',
					# 其他中间件...
					'django.middleware.cache.FetchFromCacheMiddleware',
				]

2.3对缓存粒度的控制(粒度最细),在模板中

 a. 引入TemplateTag
					{% load cache %}
b. 使用缓存
					{% cache 5000 缓存key %}, key随便取值
							缓存内容
					{% endcache %}

2.序列化,自定义序列化

from datetime import datetime, date
import json

data = [
    {"pk": 1, "name": "leon", "age": 18, 'birth': datetime.now()},
    {"pk": 2, "name": "belmont", "age": 16, 'birth': datetime.now()},
    {"pk": 3, "name": "friend", "age": 8, 'birth': datetime.now()},
    {"pk": 4, "name": "qqq", "age": 5, 'birth': datetime.now()},
    {"pk": 5, "name": "www", "age": 5, 'birth': datetime.now()}
]


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.信号,当触发某些事件的时候,自动记录日志,或者自行某些操作,有需求的时候才使用

		问题:
			数据库增加一条数据的时候,记录一条日志
			
		内置信号	
		Model signals
			pre_init                    # django的model执行其构造方法前,自动触发
			post_init                   # django的modal执行其构造方法后,自动触发
			pre_save                    # django的modal对象保存前,自动触发
			post_save                   # django的modal对象保存后,自动触发
			pre_delete                  # django的modal对象删除前,自动触发
			post_delete                 # django的modal对象删除后,自动触发
			m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
			class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
		Management signals
			pre_migrate                 # 执行migrate命令前,自动触发
			post_migrate                # 执行migrate命令后,自动触发
		Request/response signals
			request_started             # 请求到来前,自动触发
			request_finished            # 请求结束后,自动触发
			got_request_exception       # 请求异常后,自动触发
		Test signals
			setting_changed             # 使用test测试修改配置文件时,自动触发
			template_rendered           # 使用test测试渲染模板时,自动触发
		Database Wrappers
			connection_created          # 创建数据库连接时,自动触发

写在APP的__init__文件里面

4.ORM查询性能相关的

		1. 	[{} ]:尽量在查询的时候做 values 分组
			all_users = models.User.objects.all().values('name','age','role__name')
			
		2. [ 对象 ]:用的时候注意,只拿自己表中的字段,别跨表
			all_users = models.User.objects.all()
			
		3. select_related  (外键、一对一)
			all_users = models.User.objects.all().select_related('role')
			
		4. prefetch_related (role)
			all_users = models.User.objects.all().prefetch_related('role')
			
		5. only 用的时候注意,只拿自己指定的字段
			all_users = models.User.objects.all().only('name')
			
		6. defer 用的时候注意,除了该字段不拿,其余的全拿
			all_users = models.User.objects.all().defer('name')

5.验证码的使用

本质上,验证码就是在网页上面抠出一块地方用来访问一个会给你一张带数字图片的url

1.在views中

# 图片验证码
def v_code(request):
    # 新建图像          配色模式  长宽       配色板
    img_obj = Image.new('RGB', (250, 35), random_color())

    # 生成一个画笔的对象,画这个图片对象
    draw_obj = ImageDraw.Draw(img_obj)

    # 生成一个字体的对象            指定字体样式文件                 字体大小
    font_obj = ImageFont.truetype('static/font/font_style.ttf', 28)

    temp = []
    for i in range(5):
        v1 = chr(random.randint(97, 122))  # 随机大写字母
        v2 = chr(random.randint(65, 90))  # 随机小写字母
        n = chr(random.randint(0, 9))  # 随机 0-9 任意一位

        random_var = random.choice([v1, v2, n])  # 随机取一位
        temp.append(random_var)
        # 将每一位随机的验证码写进图片  位置  本次随机内容  填充颜色              字体
        draw_obj.text((i * 40 + 35, 0), random_var, fill=random_color(), font=font_obj)
    # 加干扰线
    # width = 250  # 图片宽度(防止越界)
    # height = 35
    # for i in range(5):
    #     x1 = random.randint(0, width)
    #     x2 = random.randint(0, width)
    #     y1 = random.randint(0, height)
    #     y2 = random.randint(0, height)
    #     draw_obj.line((x1, y1, x2, y2), fill=random_color())
    """"""
    # 将随机的验证码内容写进 session
    request.session['v_code'] = ''.join(temp).upper()

    from io import BytesIO
    # 内存对象
    f = BytesIO()
    # 将图片以 png 的格式保存在内存里
    img_obj.save(f, format='png')
    # 将图片文件取出来
    img_data = f.getvalue()
    return HttpResponse(img_data, content_type='img/png')

2.1在模板中

2.2需要使用js对验证码点击切换效果

3.登录视图对验证码的校验

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据技术栈

Spark系列 —— 算子详解(二)

本文接上一篇 Spark系列 —— 各类算子详解(一) 这篇主要来讲讲 Action 算子 以及 Cache 算子。

5610
来自专栏大数据技术栈

Spark随笔 —— RDD 与 DataSet

本篇文章进对 RDD 和 DataSet 进行对比和总结。 当然因为随笔,所以想到哪写到哪... 哎~,最近变懒了,都不想动脑子了!!!

10820
来自专栏机器之心

深度学习助力数据压缩,一文读懂相关理论

本文对数据压缩的「前世今生」进行简要的回顾,重点分析基于深度学习的有损压缩、无损压缩方法,对基于深度学习的数据压缩进行了探讨和展望。

13730
来自专栏AI科技评论

ICCV2019 | 旷视提出轻量级目标检测网络ThunderNet

论文地址:https://arxiv.org/pdf/1903.11752.pdf

26030
来自专栏SAMshare

MLK | 一文理清深度学习循环神经网络

在开始讲循环神经网络之前,我们可以简单来回顾一下前向神经网络的知识点,因为这一块的知识是有一些互通的呢(请戳《一文理清 深度学习前馈神经网络》)。

9140
来自专栏大数据技术栈

Kafka 关于压缩的一点经验

就压缩而言,对于数据储存应该是一个比较大的优化, 而 Kafka 自然也是支持这种特性的, 但是这里可能会有那么一点坑。 我们主要从:

16210
来自专栏代码人生

关于Spring Data redis几种对象序列化的比较

http://zhaozhiming.github.io/blog/2015/04/12/spring-data-redis/

11520
来自专栏PingCAP的专栏

高效编排有状态应用——TiDB 的云原生实践与思考

云原生时代以降,无状态应用以其天生的可替换性率先成为各类编排系统的宠儿。以 Kubernetes 为代表的编排系统能够充分利用云上的可编程基础设施,实现无状态应...

6820
来自专栏大数据技术栈

Hadoop面试复习系列——HDFS(一)

转载自: https://cloud.tencent.com/developer/article/1031641 https://my.oschina.ne...

11330
来自专栏大数据技术栈

Spark性能优化指南——基础篇

原文:https://tech.meituan.com/spark-tuning-basic.html

6520

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励