面试题之django缓存如何设置?(非常重要)

django中提供了5种缓存后端(缓存的数据存在哪里?):

目的:

1、提高查询速度
2、降低数据库的压力

1、内存

2、文件

3、数据库(本地数据库)

4、Memcache缓存(python-memcached模块)

5、安装第三方组件支持redis:django-redis组件

🔥a、安装

pip install django-redis

🔥b、配置文件settings.py,

# Redis缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache", # 缓存类型
          "LOCATION": "127.0.0.1:6379", # ip端口
          "OPTIONS": {
              "CLIENT_CLASS": "django_redis.client.DefaultClient",
              "CONNECTION_POOL_KWARGS": {"max_connections": 100}    # 连接池最大连接数
              #"PASSWORD": "密码",
              }
          }
    }

配置第一个和最后一个(顺序是一定的),

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware', # 响应HttpResponse中设置几个headers
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware', # 用来缓存通过GET和HEAD方法获取的状态码为200的响应
]

🔥c、使用缓存的五种情况

第一、 全站使用缓存(一般不会用,不会做到个性化、定制化)

用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户 # 当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存 # 请求来了,是从上到下入走中间件;响应的时候是从下到上走中间件。因此,获取页面放在最后,保存页面放最前面

🔥第二、视图中使用缓存(用的比较多)

视图缓存是将视图函数执行过程中生成缓存数据,主要以装饰器的形式来实现。装饰器有三个参数:timeout、cache和#key_prefix,参数timeout是必选参数,其余两个是可选参数。

class NewsChannelsAPIView(ModelViewSet):

    queryset = NewsChannel.objects.all()
    serializer_class = NewsChannelSerializer

    @cache_page(10, cache='default', key_prefix='mysite')
    @action(methods=['GET'],detail=False)
    def names(self,request,*args, **kwargs):
        return super().list(self, request, *args, **kwargs)

第三、路由缓存

作用与视图缓存相同,但两者是有区别的。如有两个URL同时指向一个视图函数,分别访问这两个URL时,路由缓存会判断URL是否生成缓存而决定是否执行视图函数。

from django.conf.urls import url 
from app1 import views 
from django.views.decorators.cache import cache_page 
urlpatterns = [ 
	url(r'^index/', cache_page(10,cache='default', key_prefix='mysite')(views.index)),
	]

第四、模板页面缓存

对模板某部分的数据设置缓存,常用于模板内容变动较少的情况。通过Django的缓存标签实现的,缓存标签只支持两个参数:timeout和key_prefix,以index.html为例实现模板缓存

{% load cache %} # 放在缓存片段的上面 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
	<meta charset="UTF-8"> 
	<title>模板缓存</title> 
</head> 
<body> 
<p>这里是未缓存的时间:{{ ctime }}</p>
# 将按给定的时间缓存包含块中的内容。 
# 它最少需要两个参数:缓存时间(以秒为单位);给缓存片段起的名称,该名称将被视为是字符串,而不是变量 
# 设定超时时间为10秒, 给缓存模板片段起名为 "time" 
{% cache 10 time %} 
	<p>这里是缓存的时间:{{ ctime }}</p> 
{% endcache %} 
</body> 
</html>

第五、手动缓存

如果不想为一个方法(页面)进行缓存,只想缓存某个字段的话,可以 手动缓存

from django.core.cache import cache 
from django.http.response import HttpResponse 
import time 

def index(request): 
    print('视图函数被调用') 
    result = cache.get('result') 
    if not result: 
        result = 0 
        for i in range(10): 
            result += i 
            time.sleep(0.5) 
        cache.set('result', result, 10) 
        
    ctime = time.strftime('%H:%M:%S', time.localtime()) 
    return HttpResponse("时间{}的结果是:{}".format(ctime, result))


来源:YZL40514131

物联沃分享整理
物联沃-IOTWORD物联网 » 面试题之django缓存如何设置?(非常重要)

发表评论