Django之缓存+序列化+信号+ORM性能优化+验证码
缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加
明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分
钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并
返回。
Django中提供了6种缓存方式:
开发调试
内存
文件
数据库
Memcache缓存(python-memcached模块)
Memcache缓存(pylibmc模块)
配置
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)
},
}
}redis
django-redis
应用
应用到视图上: 粒度适中
from django.views.decorators.cache import cache_page
@cache_page(15)
def user_list(request):
print('user_list')
users = models.User.objects.all()
return render(request, 'user_list.html', {'users': users})全站应用: 粒度最大
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',
]局部视图:粒度最细
a. 引入TemplateTag
{% load cache %}
b. 使用缓存
{% cache 5000 缓存key %}
缓存内容
{% endcache %}
序列化
json pickle - 自定义序列化 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))
信号
信号 问题: 数据库增加一条数据的时候,记录一条日志。
内置信号
Model signals
pre_init # django的model执行其构造方法前,自动触发
post_init # django的model执行其构造方法后,自动触发
pre_save # django的model对象保存前,自动触发
post_save # django的model对象保存后,自动触发
pre_delete # django的model对象删除前,自动触发
post_delete # django的model对象删除后,自动触发
m2m_changed # django的model中使用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 # 创建数据库连接时,自动触发注册信号
# 方法一
def callback(sender, **kwargs):
print("xxoo_callback")
print(sender, kwargs)post_save.connect(callback)# 方法二
@receiver(post_save)
def my_callback(sender, **kwargs):
print("xxoo_callback")
print(sender, kwargs) - ORM性能相关
1. [{} ]
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')验证码
- 验证码
from PIL import Image, ImageDraw, ImageFont
import randomdef random_color():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)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/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) from io import BytesIO
f1 = BytesIO()
img_obj.save(f1, format="PNG")
img_data = f1.getvalue() return HttpResponse(img_data, content_type='image/png')
Django之缓存+序列化+信号+ORM性能优化+验证码的更多相关文章
- Django之缓存、信号和图片验证码、ORM性能
一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...
- Django ORM性能优化 和 图片验证码
一,ORM性能相关 1. 关联外键, 只拿一次数据 all_users = models.User.objects.all().values('name', 'age', 'role__name') ...
- Django之缓存、信号和图片验证码
一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...
- Django的缓存,序列化,ORM操作的性能
1,缓存:把数据先保存在某个地方,下次再读取的时候不用再去原位置读取
- Django ORM性能优化之count和len方法的选择(非常详细推荐干货)
接下来我将从源码层面分情况和应用分析我们在计算queryset数据集时是用orm的count函数计算长度还是用len函数计算数据集长度. 首先,我们知道ORM查询queryset数据集是惰性查询的,只 ...
- python django ORM 性能优化 select_related & prefetch_related
q = models.UserInfo.objects.all() select * from userinfo select * from userinfo inner join usertype ...
- 缓存技术之——Yii2性能优化之:缓存依赖
Yii中的缓存依赖,简单来说就是将缓存和另外一个东西绑定在一起,如果另外一个东西发生变化,那么缓存也将发生变化.有点儿类似于JS中的触发事件(但是也不那么像),缓存的变动是依赖的东西所导致的. 依赖可 ...
- web性能优化之--合理使用http缓存和localStorage做资源缓存
一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...
- 记录一次bug解决过程:可维护性和性能优化
一.总结 使用某些变量的地方在2次以上的,强烈建议使用枚举值来维护变量,日后方便扩展. 查数据库的方法调用,能合并就净量去合并. 二.Bug描述 枚举变量的维护以及方法使用: public class ...
随机推荐
- oracle删除重复数据只保留一条
-- 如表role_user的数据 ROLEID USERID -- 删除相同记录只剩下一条记录 根据两个字段查询重复数据 (roleid,userid) ) 删除重复数据只保留一条 delete f ...
- Storm worker 并行度等理解
Storm 调优是非常重要的, 仅次于写出正确的代码, 好在Storm官网上有关于worker executors tasks的介绍, http://storm.incubator.apache.or ...
- 粉红色织梦CMS企业模板
粉红色织梦CMS企业网站模板,粉红色,织梦CMS,织梦企业模板,CMS模板. 模板地址:http://www.huiyi8.com/sc/7247.html
- PS 滤镜— —球面化效果
clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...
- MySQL当月负毛利订单明细_20161027
#当月每天负毛利订单明细 SELECT c.ID,a.city AS 城市,a.username AS 用户ID,a.订单日期,a.订单号,a.销售确认额,a.成本额,a.毛利1, CASE THEN ...
- python爬虫知识点总结(五)正则表达式
在线正则表达式匹配:http://tool.oschina.net/regex 正则表达式学习:https://c.runoob.com/front-end/854 一.什么是正则表达式? 常见匹配模 ...
- MQTT协议简介及协议原理
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ...
- Python创建删除文件
Python代码如下: import os directory = "E:\\学习日志\\" os.chdir(directory) # 改变当前工作目录 cwd = os.get ...
- 梯度算子(普通的+Robert + sobel + Laplace)
1.水平垂直差分法: 2.Robert 算子梯度 3.sobel算子 4.拉普拉斯算子
- Java集合框架(1)
Collection接口:它是Java集合框架的一个根接口,也是List.Set和Queue接口的父接口.同时它定义了可用于操作List.Set和Queue的方法—增删改查. Map接口:它提供了一种 ...