缓存

由于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. python的小知识点

    python中的变量的名字必须由字母.数字.下划线组成,并且不可以以数字开头. 字典的内容是键-值对,键必须是不可变的,比如字符,整数,浮点数,元组,列表不可以,因为列表可变.集合的元素不重复.字典和 ...

  2. 标准兼容HTML5输入框提示信息的插件iHolder_v0.1.06.21.2014_预览版

    由于版面限制,简单说下,详细的内容及在线预览.预览版压缩包,见这里http://levi.cg.am/archives/3507 为什么说是标准兼容: 因为大多数placeholder插件是这样兼容的 ...

  3. spring2.5和struts1.3.8整合

    第一步:导入对应jar文件 第二步: 1.在web容器中实例化spring容器 <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpa ...

  4. Django:locals()小技巧

    locals()返回一个包含当前作用域里面的所有变量和它们的值的字典. 所以可以把views改写为 def current_datetime(request):     current_date = ...

  5. MyEclipse异常关闭导致启动不了tomcat的解决方法

     由于MyEclipse的异常关闭从而导致Tomcat并没有关闭,所以再次启动Tomcat当然是无法启动的啦,解决方法:在任务管理器中关闭一个叫javaw.exe的进程,如果你这时已经启动了MyEcl ...

  6. C# Json库 和 xml 序列化反序列化 存在的问题

    json 正常情况下不会对私有成员进行序列化和反序列化, 因此在用json做深拷贝时, 就会丢失数据. 解决办法:       声明成公有成员. json在序列化和反序列化时, 如果类中有IComma ...

  7. Mongo可视化工具基本操作

    一.可视化工具界面(字段名可以不加引号) 二.查询(query)1.日期如:"F1":ISODate("2017-07-26T16:00:00Z")2.条件(& ...

  8. ReportEvent的正确使用方式

    向操作系统的事件管理器报告重大信息是一种非常有用的方式,特别是对于没有界面的后台服务而言.如果你对Windows编程有一定了解,应该很快就能想到使用ReportEvent这个API,然后快速写出下面的 ...

  9. Fluuter常遇到的问题

    The ADB binary found at XX is obsolete and has seriousperformance problems with the Android Emulator ...

  10. 如何在VS2015中使用Git命令提示符

    本文转载自 http://qkxue.net/info/176223/Visual-Studio-Git VS2015自带了Git插件,但有时候觉得Git控制台命令更方便些.VS中本身不能把Git B ...