Django 搭建博客项目(9)-缓存的使用

2020-08-27  本文已影响0人  零星瓢虫

对于博客项目中目前的设计,假设每一次去点击博客的分类,都会去分类的数据库中去查询对应的博客分类数据。这样的每次都去查询数据库效率比较低,所以对于一些不需要及时更新的数据,就需要使用到缓存,同时隔一定的时间对相应的缓存进行更新。

效果图_1.png

这里对右上角分类模块的请求做缓存处理。

django 中的缓存大致分为全站缓存、views 层级缓存和模板层级缓存。下面对此一一进行分析。

全站缓存:

全站缓存,即对整个项目中所有的请求都进行缓存策略。
首先,配置 setting.py 中的缓存中间件配置:

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 必须放在第一位
    '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',  # 必须放在最后一个
]

UpdateCacheMiddleware 中间件需要放在首位最先进行更新缓存,经过了下面的安全认证后,才能够通过 FetchFromCacheMiddleware 中间件获取到这个请求,所以放在最后面。

setting.py 中缓存的相关设置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

CACHE_MIDDLEWARE_KEY_PREFIX = ''
CACHE_MIDDLEWARE_SECONDS = 600
CACHE_MIDDLEWARE_KEY_PREFIX = 'default'

上述配置表示默认缓存存在本地的内存信息,缓存时间为 10 min,同时指定缓存的 key 为 default。 此时则使用了 django 提供的缓存中间件对每个请求进行了缓存处理。

views 层级的缓存:

view 层级中的缓存在 view.py 问价代码中进行实现:


def cache_wrapper(func):
    def _wrapper(request, *args, **kwargs):
        # 从缓存对象中获取数据
        data = cache.get(request.path)
        # 判断缓存中是否存在数据
        if data:
            print('读取缓存中的数据')
            return HttpResponse(data)
        # 从数据库中获取数据
        print('从数据库中获取数据')
        response = func(request, *args, **kwargs)

        # 将数据库中查询到的数据存入缓存
        cache.set(request.path, response.content)
        return response
    return _wrapper

# 根据类别id查询所有帖子
@cache_wrapper
def queryPostByCid(request, cid):
    postList = Post.objects.filter(category_id=cid)
    # Post.objects.filter(category__id=cid)
    return render(request, 'article.html', {'postList': postList})

可以看到,views 层级利用缓存对 queryPostByCid 方法进行了包装。此时我们分别对分类中的第一个分类点击两次,查看对应的输出情况。

效果图_2.png

正常进行缓存,后续操作均从缓存中读取信息。对于动态需要及时进行改变的内容这里并不适用。

欢迎关注公众号 【python面面观】,在聊天对话框回复「博客」获取源码地址以及其他 python 相关知识。

模板层级缓存

模板层级,即对相应 html 模板进行缓存,这里在 article.html 模板中进行举例。

{% extends 'base.html' %}

{% block title %}
    帖子列表
{% endblock %}
{% block left %}
    <div id="main">
        {% load cache %}
        {% cache 10000 archives %} {# 这里缓存名称为 archives 时间为 10s #}
            <div class="archives">
            {% for post in postList %}
                <article class="archive-article archive-type-post">
                    <div class="archive-article-inner">
                        <header class="archive-article-header">
                            <a href="#" class="archive-article-date">
                                <time>{{ post.created|date:'Y-m' }}</time>
                            </a>
                            <h1 itemprop="name">
                                <a class="archive-article-title" target="_blank"
                                   href="/post/{{ post.id }}">{{ post.title }}</a>
                            </h1>
                        </header>
                    </div>
                </article>
            {% endfor %}
        {% endcache %}
        </div>
    </div>
{% endblock %}

通过在模板中使用 loadcache 标签即相关配置,即在模板层级进行相关数据的缓存。

上一篇 下一篇

猜你喜欢

热点阅读