85 缓存, 验证码 序列化

主要内容:http://www.cnblogs.com/maple-shaw/articles/7563029.html

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

    缓存即是将一个某个views的返回值保存至内存或者是memcache中, 在你所设置的时间内, 如果有人再来访问的时候, 则不会再执行view中的操作, 而是直接从内存或者memcache中之前的缓存的内容中拿到.

  jango提供的六种缓存方式: 见老师博客:

  1: 缓存应用在视图中:  粒度适中

    先在settings中设置

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

    2 接着写url, 视图函数, HTML文件

from django.views.decorators.cache import cache_page
@cache_page(15)
def user_list(request):
    print(‘this is user‘)
    all_user = models.User.objects.all()
    return render(request, ‘user.html‘, {‘all_user‘: all_user})

    结论: 在15 秒之内访问该视图, 直接从缓存中取值, 不走数据库, 提高效率

  2 缓存在文件中

    1 settings里的配置, views里不变

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

  3 全站应用:  力度最大

    setings里的配置:

MIDDLEWARE = [
		‘django.middleware.cache.UpdateCacheMiddleware‘,
		# 其他中间件...
		‘django.middleware.cache.FetchFromCacheMiddleware‘,
				]

    

  4 局部应用: 粒度最细

    用法:  先在模板中{% load cache%}

        使用缓存: {% cache 5 ‘随意的字符串‘%}缓存内容{%endcache%}

    视图中的用法:

# 局部应用缓存
# 此时应该把中间件中的全站的应用给注销掉
def user_list(request):
    now = time.time()
    all_user = models.User.objects.all()
    return render(request, ‘user.html‘, {‘all_user‘: all_user, ‘now‘: now})

    模板中的用法:

<body>
{{ now }}
<ul>
    {% cache 5 ‘asss‘ %}
        {{ now }}
        {% for user in all_user %}
            <li>{{ user.name }}-{{ user.age }}</li>
        {% endfor %}
    {% endcache %}
</ul>
</body>

2  序列化:关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。

  1 , serializes

from django.core import serializers
# def user_list(request):
#     now = time.time()
#     all_user = models.User.objects.all()
#     print(all_user)
#     # <QuerySet [<User: User object>, <User: User object>, <User: User object>]>
#     data = serializers.serialize(‘json‘, all_user)
#     print(‘this si 序列化的结果‘, data)
#     #  [{"model": "app01.user", "pk": 1, "fields": {"name": "\u8bd7\u8bd7", "age": 28}},]

  2 , json.dumps, 由于queryset不支持dumps, 所以转换成list

all_user = models.User.objects.all().values(‘name‘)
    # <QuerySet [{‘name‘: ‘诗诗‘}, {‘name‘: ‘菲菲‘}, {‘name‘: ‘圆圆‘}]>
    all_user1 = models.User.objects.all().values_list(‘name‘)
    ret = list(all_user1)
    # 把ret转换成列表
    # [(‘诗诗‘,), (‘菲菲‘,), (‘圆圆‘,)]
    result = json.dumps(ret)
    print(result)
    # <QuerySet [(‘诗诗‘,), (‘菲菲‘,), (‘圆圆‘,)]>

 3 , 由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:

import json
from datetime import datetime, date
data = [
    {"pk": 1, "name": "\u83b9\u83b9", "age": 18, ‘birth‘: datetime.now()},
    {"pk": 2, "name": "\u5c0f\u5fae", "age": 16, ‘birth‘: datetime.now()},
    {"pk": 3, "name": "\u5c0f\u9a6c\u54e5", "age": 8, ‘birth‘: datetime.now()},
    {"pk": 4, "name": "qqq", "age": 5, ‘birth‘: datetime.now()},
    {"pk": 5, "name": "www", "age": 5, ‘birth‘: datetime.now()}
]

# 由于日期类型不支持json序列化, 所以自定义类来扩展:
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 信号:Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

  1 : jango的内置信号,见老师博客

  2 : 用法:对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:注册信号,写入与project同名的文件夹下的_init_.py文件中,也是换数据库引擎的地方。

from django.db.models.signals import pre_save, post_save
# 方法一
def callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender, kwargs)
post_save.connect(callback)

  3 在创建对象的时候, 自动触发注册函数

def get_value(request):
    # users = models.User.objects.all().values(‘pk‘, ‘name‘, ‘age‘)
    users = models.User.objects.create(name=‘ale‘, age=12)
    # ret = serializers.serialize(‘json‘, users)
    # ret = serializers.serialize(‘json‘, users)
    return HttpResponse(‘ok‘)
#  触发显示的内容:
# xxoo_callback
# <class ‘app01.models.User‘> {‘signal‘: <django.db.models.signals.ModelSignal object at 0x0000026D2F38F898>, ‘instance‘: <User: User object>, ‘created‘: True, ‘update_fields‘: None, ‘raw‘: False, ‘using‘: ‘default‘}

   自定义信号见老师博客

4  验证码:

  

  

原文地址:https://www.cnblogs.com/gyh412724/p/9918063.html

时间: 2024-10-29 16:46:35

85 缓存, 验证码 序列化的相关文章

Django 缓存、序列化、信号

缓存.序列化.信号 一.缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者memcache中之前缓存的内容拿到,并返回. Django中提供了6种缓存方式: 开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块) Memcache缓存(p

分页,缓存,序列化,信号

一.分页 1.Django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger L = [] for i in range(999): L.append(i) def index(request): current_page = request.GET.get('p') paginator = Paginator(L, 10

php 给app写短信验证码 使用memcache缓存验证码

废话不多说  直接上代码 直接使用session 储存短信验证码,app  那边一直说获取不到 注册的时候一直提示空  后面想想还是用缓存吧 上代码: //发送验证码方法 public function sendSMSCodeOp(){ require_once(BASE_ROOT_PATH.DS.'api/framework/function/sms.php'); require_once(BASE_ROOT_PATH.DS.'api/framework/function/common.php

django的缓存,信号,序列化

一 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力. 缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.

缓存、序列化、信号

https://www.cnblogs.com/maple-shaw/articles/7563029.html 一.缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者memcache中之前缓存的内容拿到,并返回. Django中提供了6种缓存方式: 开发调试 内存 文件

SpringBoot2.x整合Redis缓存自定义序列化

一.导入Jar包 <!--rabbitmq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <a

Oracle Coherence中文教程十五:序列化分页缓存

序列化分页缓存 本章提供了大量的二进制数据的离堆缓存信息. 本章包含以下各节: 了解序列化分页缓存 分页缓存配置序列化 优化分区的高速缓存服务 配置高可用性 配置负载平衡和故障转移 支持巨大的缓存 15.1了解序列化分页缓存 Coherence提供高效巨额自动过期数据使用潜在的高延迟的存储机制,如磁盘文件缓存的明确支持.其优点包括支持更大的数据集可以管理在内存中,同时保留出了管理时序的一个有效的终止机制(和自动释放的资源管理有关的) ,该数据.最佳使用场景包括许多大型对象存储能力,很少访问XML

序列化接口的id的作用

对象经常要通过IO进行传送,让你写程序传递对象,你会怎么做?把对象的状态数据用某种格式写入到硬盘,Person->"zxx,male,28,30000"Person,既然大家都要这么干,并且没有个统一的干法,于是,sun公司就提出一种统一的解决方案,它会把对象变成某个格式进行输入和输出,这种格式对程序员来说是透明(transparent)的,但是,我们的某个类要想能被sun的这种方案处理,必须实现Serializable接口. ObjectOutputStream.writeOb

Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

Android公共库--图片缓存 网络缓存 下拉及底部更多ListView 公共类 转载自http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工具类(网络.下载.shell.文件.json等等). TrineaAndroidCommon已开源,地