缓存

配置settings.py
# 1.
# 开发调试用,实际内部不做任何操作
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎
'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存个数(默认300),就是说,比如网站有500个页面,我只对其中的300个做缓存。
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
},

# 下面设置缓存关键字和url的对应关系。
'KEY_PREFIX': '', # 缓存key的前缀(默认空)
'VERSION': 1, # 缓存key的版本(默认1)
'KEY_FUNCTION':'函数名' # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}
# 源码, 也可以自定制
def default_key_func(key, key_prefix, version):
"""
Default function to generate keys.

Constructs the key used by all other methods. By default it prepends
the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
function with custom key making behavior.
"""
return '%s:%s:%s' % (key_prefix, version, key) #默认是冒号为分隔符

# 2
# 此缓存将内容保存至内存的变量中,一个键值对对应一个缓存。
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake', #变量名。缓存内容保存为一个字典,比如,unique-snowflake = {'键':'值',...}
}
}
# 注:其他配置同开发调试版本

# 3
# 此缓存将内容保存至文件,一个文件对应一个缓存。
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache', #路径/目录,路径下面会生成多个文件。
}
}
# 注:其他配置同开发调试版本

# 4
# 此缓存将内容保存至数据库,一条数据对应一条缓存。
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table', # 数据库表
}
}
# 注:执行创建表命令 python manage.py createcachetable

# 5
# 此缓存使用python-memcached模块连接memcache,会在另一台机器的内存中保存一个字典,一个键值对对应一条缓存。
# 5.1
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211', #IP和端口。保存在本机或另一台机器的内存中。
}
}
# 5.2
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'unix:/tmp/memcached.sock', #文件路径,只能是本机
}
}
# 5.3
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [ #支持集群
# '172.19.26.240:11211',
# '172.19.26.242:11211',
('172.19.26.240:11211',10), #元组形式,后面是权重
('172.19.26.242:11211',200),
]
}
}


以文件缓存为例:
视图级别缓存:只对index这个函数做缓存。
settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': os.path.join(BASE_DIR, 'cache'), #路径/目录,路径下面会生成多个文件。
}
}
views.py
from django.views.decorators.cache import cache_page
@cache_page(10) #超时时间10s
def index(reqeust):
import time
v = time.time()
return HttpResponse(v)

视图局部缓存:
settings.py配置一样。
views.py
def part(request):
import time
v = time.time()
return render(request,'part.html', {'v': v })
part.html
{% load cache %} #先导入缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ v }}</h1>

<!--视图局部缓存-->
{% cache 10 kkkkk %} <!--超时时间,名字-->
<h3>{{ v }}</h3> <!--先到缓存中取,如果超时才用这个-->
{% endcache %}
</body>
</html>

全局缓存:
settings.py
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware', # 第一个中间件只用于返回缓存。

...

'django.middleware.cache.FetchFromCacheMiddleware', # 最后一个中间件只用于获取缓存。

# 全局缓存的执行流程:
# 刚开始,经过第一个中间件时跳过,依次执行中间的,到最后一个中间件时到缓存获取数据,
# 这时还没有缓存,所以执行视图函数,到中间件时,跳过最后一个中间件,依次执行中间的,到最后一个中间件时返回数据。

# 以后再访问时,经过第一个中间件时跳过,依次执行中间的,到最后一个中间件时到缓存获取数据,
# 返回,依次执行中间的,到最后一个中间件时返回缓存给用户。
]
views.py
def part(request):
import time
v = time.time()
return render(request,'part.html', {'v': v })
part.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ v }}</h1>

<h3>{{ v }}</h3>
</body>
</html>


缓存session:
(下面是Django的五种session)

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

数据库(默认)
缓存
文件
缓存+数据库
加密cookie

1、数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)

SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
b. 使用
def index(request):
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()


# 用户session的随机字符串
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")

# 删除当前用户的所有Session数据
request.session.delete("session_key")

request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

2、缓存Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
b. 使用同上

3、文件Session
a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T


SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
b. 使用同上

4、缓存+数据库Session
数据库用于做持久化,缓存用于提高效率
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
b. 使用同上

5、加密cookie Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
b. 使用同上

posted @ 2017-05-07 20:56  羊小羚  阅读(65)  评论(0)    收藏  举报