缓存

由于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 random
    def 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性能优化+验证码的更多相关文章

  1. Django之缓存、信号和图片验证码、ORM性能

    一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...

  2. Django ORM性能优化 和 图片验证码

    一,ORM性能相关 1. 关联外键, 只拿一次数据 all_users = models.User.objects.all().values('name', 'age', 'role__name') ...

  3. Django之缓存、信号和图片验证码

    一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...

  4. Django的缓存,序列化,ORM操作的性能

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

  5. Django ORM性能优化之count和len方法的选择(非常详细推荐干货)

    接下来我将从源码层面分情况和应用分析我们在计算queryset数据集时是用orm的count函数计算长度还是用len函数计算数据集长度. 首先,我们知道ORM查询queryset数据集是惰性查询的,只 ...

  6. python django ORM 性能优化 select_related & prefetch_related

    q = models.UserInfo.objects.all() select * from userinfo select * from userinfo inner join usertype ...

  7. 缓存技术之——Yii2性能优化之:缓存依赖

    Yii中的缓存依赖,简单来说就是将缓存和另外一个东西绑定在一起,如果另外一个东西发生变化,那么缓存也将发生变化.有点儿类似于JS中的触发事件(但是也不那么像),缓存的变动是依赖的东西所导致的. 依赖可 ...

  8. web性能优化之--合理使用http缓存和localStorage做资源缓存

    一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...

  9. 记录一次bug解决过程:可维护性和性能优化

    一.总结 使用某些变量的地方在2次以上的,强烈建议使用枚举值来维护变量,日后方便扩展. 查数据库的方法调用,能合并就净量去合并. 二.Bug描述 枚举变量的维护以及方法使用: public class ...

随机推荐

  1. Java 并发 —— Java 标准库对并发的支持及 java.util.concurrent 包

    0. Collections.synchronizedXxx() Java 中常用的集合框架中的实现类:HashSet/TreeSet.ArrayList/LinkedList.HashMap/Tre ...

  2. 每天一个linux命令(5):mkdir命令

    版权声明更新:2017-05-09博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下命令mkdir. 2 ...

  3. 「51Nod1639」绑鞋带(概率

    1639 绑鞋带  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有n根鞋带混在一起,现在重复n次以下操作:随机抽出两个鞋带头,把它们绑在一起.可 ...

  4. 2084. Asm.Def的基本算法

    2084. Asm.Def的基本算法 传送门 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] ...

  5. django orm 操作符

    __gt 大于__gte 大于等于__lt 小于__lte 小于等于__in__exact 精确等于 like 'aaa'__iexact 精确等于 忽略大小写 ilike 'aaa'__contai ...

  6. C# 获取Console的输入和输出 数据 (异步)

    using System ; using System .Diagnostics; using System .IO;   class Program {     static void Main() ...

  7. 自动化测试【Maven+Eclipse+Selenium+Java环境搭建和测试】

    一.下载必要的文件 1.eclipse Eclipse官网 2.jdk jdk官网 3.selenium IDE.Selenium Server.Selenium Client Drivers(Jav ...

  8. mysql两主多从

    1.实现目标 目标清单: 1)Master(192.168.31.230)为正常运行环境下的主库,为两个Slave(192.168.31.231和192.168.31.232)提供“主-从”复制功能: ...

  9. 转:在Linux上安装ant环境

    1.从http://ant.apache.org 上下载tar.gz版ant 2.复制到/usr下 3.tar -vxzf apahce-ant-1.9.2-bin.tar.gz  解压 4.chow ...

  10. 如何获取AppStore上应用的ipa安装包

    1.首先你得去下载一个Apple Configurator 2,我们通过这个工具来获取ipa包,从AppStore上下载安装你需要获取的App 2.连接手机,打开Apple Configurator ...