📅  最后修改于: 2020-10-25 10:04:48             🧑  作者: Mango
缓存某些内容是为了保存昂贵的计算结果,以便下次需要时不执行它。以下是解释缓存如何工作的伪代码-
given a URL, try finding that page in the cache
if the page is in the cache:
return the cached page
else:
generate the page
save the generated page in the cache (for next time)
return the generated page
Django带有自己的缓存系统,可让您保存动态页面,避免在需要时再次计算它们。 Django Cache框架的优点是您可以缓存-
要在Django中使用缓存,首先要做的是设置缓存将保留的位置。缓存框架提供了不同的可能性-缓存可以保存在数据库中,文件系统中或直接保存在内存中。设置是在项目的settings.py文件中完成的。
只需在项目settings.py文件中添加以下内容-
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_table_name',
}
}
为了使它起作用并完成设置,我们需要创建缓存表“ my_table_name”。为此,您需要执行以下操作-
python manage.py createcachetable
只需在项目settings.py文件中添加以下内容-
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
这是最有效的缓存方式,要使用它,可以根据您为内存缓存选择的Python绑定库,使用以下选项之一-
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
要么
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'unix:/tmp/memcached.sock',
}
}
在Django中使用缓存的最简单方法是缓存整个网站。这是通过在项目settings.py中编辑MIDDLEWARE_CLASSES选项来完成的。需要在选项中添加以下内容-
MIDDLEWARE_CLASSES += (
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
请注意,这里的顺序很重要,更新应该先于获取中间件。
然后在同一文件中,您需要设置-
CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.
如果您不想缓存整个站点,则可以缓存特定的视图。这是通过使用Django随附的cache_page装饰器完成的。假设我们要缓存viewArticles视图的结果-
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def viewArticles(request, year, month):
text = "Displaying articles of : %s/%s"%(year, month)
return HttpResponse(text)
如您所见, cache_page花费了您希望视图结果作为参数缓存的秒数。在上面的示例中,结果将被缓存15分钟。
注意-如上图所示,我们已经映射到-
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P\d{2})/(?P\d{4})/', 'viewArticles', name = 'articles'),)
由于URL采用参数,因此每个不同的调用将被分别缓存。例如,对/ myapp / articles / 02/2007的请求将分别缓存到/ myapp / articles / 03/2008。
也可以直接在url.py文件中缓存视图。然后,以下结果与上述相同。只需编辑myapp / url.py文件并将相关的映射URL(上方)更改为-
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P\d{2})/(?P\d{4})/',
cache_page(60 * 15)('viewArticles'), name = 'articles'),)
而且,当然,myapp / views.py中不再需要它。
您还可以缓存模板的各个部分,这可以通过使用cache标记完成。让我们采用hello.html模板-
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}
Hello World!!!Today is {{today}}
We are
{% if today.day == 1 %}
the first day of month.
{% elif today == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
{% for day in days_of_week %}
{{day}}
{% endfor %}
{% endblock %}
为了缓存内容块,我们的模板将变为-
{% load cache %}
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% cache 500 content %}
{% block content %}
Hello World!!!Today is {{today}}
We are
{% if today.day == 1 %}
the first day of month.
{% elif today == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
{% for day in days_of_week %}
{{day}}
{% endfor %}
{% endblock %}
{% endcache %}
如您在上面看到的,缓存标记将采用2个参数-您希望缓存该块的时间(以秒为单位)以及要赋予该缓存片段的名称。