前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day85- <缓存+序列化+信号+ORM性能相关+随机验证码>

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

原创
作者头像
少年包青菜
修改2019-11-18 11:51:25
3530
修改2019-11-18 11:51:25
举报
文章被收录于专栏:Python 学习Python 学习

1.缓存

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

代码语言:javascript
复制
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中

代码语言:javascript
复制
全站应用: 粒度最大
				MIDDLEWARE = [
					'django.middleware.cache.UpdateCacheMiddleware',
					# 其他中间件...
					'django.middleware.cache.FetchFromCacheMiddleware',
				]

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

代码语言:javascript
复制
 a. 引入TemplateTag
					{% load cache %}
b. 使用缓存
					{% cache 5000 缓存key %}, key随便取值
							缓存内容
					{% endcache %}

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

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

代码语言:javascript
复制
		问题:
			数据库增加一条数据的时候,记录一条日志
			
		内置信号	
		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查询性能相关的

代码语言:javascript
复制
		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.验证码的使用

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

1.在views中

代码语言:javascript
复制
# 图片验证码
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.登录视图对验证码的校验

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.缓存
    • 1.缓存的配置,在settings里面,是必定要配置,一共好几种。这个先做个了解
      • 2.1对缓存粒度的控制(粒度中等),在视图中
        • 2.2对缓存控制的粒度(粒度最大),在settings中
          • 2.3对缓存粒度的控制(粒度最细),在模板中
          • 2.序列化,自定义序列化
          • 3.信号,当触发某些事件的时候,自动记录日志,或者自行某些操作,有需求的时候才使用
            • 写在APP的__init__文件里面
            • 4.ORM查询性能相关的
            • 5.验证码的使用
              • 1.在views中
                • 2.1在模板中
                  • 2.2需要使用js对验证码点击切换效果
                    • 3.登录视图对验证码的校验
                    相关产品与服务
                    文件存储
                    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档