python之路_day105_django之缓存、信号、admin

一、缓存

  缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。

  django中提供了6中缓存,分别为:(1)开发者调试缓存;(2)内存缓存;(3)文件缓存;(4)数据库缓存;(5)使用python-memcached模块的Memcache缓存;(6)使用pylibmc模块的Memcache缓存。其中经常使用缓存为文件缓存和Memcache缓存。

  具体各种缓存的使用配置请参考博客:http://www.cnblogs.com/yuanchenqi/articles/8034442.html#_label2,如下介绍django中三种缓存的应用实例:

1、全局使用缓存

  全局缓存即指对整个项目中的视图进行缓存,像这种情况当然是利用中间件进行进行,中间件具体配置的方式如下:通过配置如下两个中间件和缓存失效时间,便可以使所有的视图查询数据都会在缓存失效时间范围内从缓存中查取数据。

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',                           # 所有中间件开始处
    .................................................
    'django.middleware.cache.FetchFromCacheMiddleware',                        #所有中间件结尾处
 )
CACHE_MIDDLEWARE_SECONDS=10                                                    #用于设置缓存的失效时间

2、视图使用缓存

  视图缓存即是只对指定的视图内的数据进行缓存设置,主要配置的方式如下:通过给需要缓存的视图的加装饰器@cache_page(缓存时间)便可实现视图的缓存,如下例将获得当前的当前时间在页面显示,如果是在缓存失效的时间内进行第二次访问此视图,则页面上前后显示的时间是一样的。

from django.views.decorators.cache import cache_page
import time
@cache_page(15)                                                                 #缓存失效时间15s
def index(request):
     t=time.time()
     return render(request,"index.html",locals())

3、视图局部缓存

  视图局部缓存是指视图中的某一条数据进行缓存设置,如,刷新页面时,整个网页有一部分实现缓存,具体实例如下:由此可见视图局部的缓存实现主要是在html文件中进行设置,如下实例,在有效的缓存时间范围内两次访问此页面,页面的显示的第二条时间不会发生变化。

视图函数:

import time
def index(request):
     t=time.time()
     return render(request,"index.html",locals())

html文件:

{% load cache %}                        #第一步
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 <h3 style="color: green">不缓存:{{ t }}</h3>

{% cache 10 'name' %}                    #第二步:需要两个参数,第一个为缓存时间,第二个即为name
 <h3>缓存:{{ t }}</h3>
{% endcache %}
</body>
</html>

二、信号

  信号的实现的效果就是监听指定的动作,当指定的动作发生后执行相应的操作,有点同回调函数的意思。django中提供了很多的动作信号,介绍如下:当配置好指定的信号是,相应的动作发生时,信号就会执行其相应的回调函数。

Model signals
    pre_init                    # django的modal执行其构造方法前,自动触发
    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          # 创建数据库连接时,自动触发

  如果需要记录项目中向数据库添加数据的日志,就可用到post_save信号,一旦项目中有添加数据的操作时就会执行信号对应的回调函数。注意,信号的设置一般配置在应用或者项目的init.py中,保证项目运行后,信号被启动。如下实例:

方式一:信号与callback绑定关系

from django.db.models.signals import pre_save, post_save

def callback(sender,**kwargs):
   '''
执行保存日志逻辑,sender
和kwargs参数有你想要的数据
''' print(sender) print(kwargs) post_save.connect(callback)

方式二:给callback加装饰器

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save)
def callback(sender,**kwargs):
    print(sender)
    print(kwargs)

三、admin管理工具

  详细内容可以参考博客:http://www.cnblogs.com/yuanchenqi/articles/8323452.html

原文地址:https://www.cnblogs.com/seven-007/p/8336718.html