缓存场景:
1.博客列表页
2.电商商品详情页
场景特点:缓存的地方,数据变动频率较少
Django中设置缓存 --- 数据库缓存
将缓存的数据存储在数据库中 说明:尽管存储介质没有更换,但是当一次负责查询的结果直接存储到表里,不如多个条件的过滤查询拿结果,可避免重复进行复杂查询,提升效率
#数据库缓存 需手动执行创建表的命令
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'my_cache_table',#手动创建表
'TIMEOUT':300,#缓存保存时间,单位秒,默认值300
'OPTIONS':{
'MAX_ENTRIES':300,#缓存最大数据条数
'CULL_FREQUENCY':2,#缓存条数达到最大时,删除1/x的缓存数据
}
}
}
python manage.py createcachetable #执行创建my_cache_table表的命令 python manage.py migrate #进行数据迁移
Django中使用缓存(整体缓存) ---- 视图函数中
#装饰器
from django.views.decorators.cache import cache_page
@cache_page(30) -->单位s
def my_view(request):
...
Django中使用缓存(整体缓存) ---- 路由中
from django.views.decorators.cache import cache_page
urlpatterns = [
path('foo/',cache_page(60)(my_view)),
]
例子:
#views.py代码
@cache_page
def test_cache(request):
t = time.time()
return HttpResponse('t is %s'%(t))
#有缓存走缓存 没缓存走视图
#url.py代码
from django.urls import path
from . import views
urlpatterns = [
path('test_page/',views.test_cache),
]
时间是不变的,每隔15秒之后就会变化
局部缓存
1.cache.set(key,value,timeout) -- 存储缓存
key:缓存的key,字符串类型
value:python对象
timeout:缓存存储时间(s),默认为caches中的timeout值
返回值;None
2.cache.get(key) --获取缓存
key:缓存的key
返回值:为key的具体值,如果没有数据,则返回None
3.cache.add(key,value) --存储缓存,只在key不存在时生效,返回值:True[存储成功]or False[存储失败]
例子;
浏览器缓存策略
中间件
中间件是Django请求/响应处理的钩子框架,他是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出,中间件以类的形式体现,每个中间件组件AuthenticationMiddleware,它使用会话将用户与请求关联起来
编写中间件
中间件类必须继承自django.utils.deprecation.MiddlewareMixin类
中间件类须实现下列五个方法中的一个或多个:
process_request(self,request)
执行主路由之前被调用,在每个请求上调用,返回None或httpresponse对象
process_view(self,request,callback,callback_args,callback_kwargs)
调用视图之前被调用,在每个请求上调用,返回None或httpresponse对象
process_response(self,request,response)
所有响应返回浏览器被调用,在每个请求上调用,返回HttpResponse对象
process_exception(self,request,exception)
当处理过程中抛出异常时调用,返回一个httpresponse对象
process_template_response(self,request,response)
在视图函数执行完毕且视图返回的对象中包含render方法时被调用,该方法需要返回实现了
render方法的响应对象
注:中间件中的大多数方法在返回None时表示忽略当前操作进入下一项时间,当返回httpresponse对象时表示此请求结束,直接返回给客户端
注册中间件
settings.py中需要注册一下自定义的中间件
#file:settings.py
MIDDLEWARE = [ ...... ]
注意;配置为数组,中间件被调用时以"先上到下"再“由下到上”的顺序调用
例子;
#第一步:需要先在项目下新建middleware文件夹
#第二步:在middleware文件夹下新建mymiddleware.py文件和_init_.py文件
#第三步:mymiddleware.py下的代码;
from django.utils.deprecation import MiddlewareMixin
class MyMW(MiddlewareMixin):
def process_request(self,request):
print('MyMW process_request do ---')
def process_view(self,request,callback,callback_args,callback_kwargs):
print('MyMW process_views do ---')
def process_response(self,request,response):
print('MyMW process_response do ---')
return response
#第一步:在setting.py下找到MIDDLEWARE添加代码:'middleware.mymiddleware.MyMW',
#第二步:views.py下的代码:
def test_mw(request):
print('--test_mw view in ---')
return HttpResponse('---test_mw---')
urls.py下的代码:
path('test_mw/',views.test_mw),
结果: 命令行下的输出:
#mymiddleware.py代码
class VisitLimit(MiddlewareMixin):
visit_times = {}
def process_request(self,request):
ip_address = request.META['REMOTE_ADDR']
path_url = request.path_info
if not re.match('^/music',path_url):
return
times = self.visit_times.get(ip_address,0)
print('ip',ip_address,'已经访问',times)
self.visit_times[ip_address] = times+1
if times < 5:
return
return HttpResponse('您已经访问过'+str(times)+'次,访问被禁止')
#settings.py中的MIDDLEWARE添加'middleware.mymiddleware.VisitLimit',
#views.py 代码
def test_mw(request):
print('--test_mw view in ---')
return HttpResponse('---test_mw---')
#urls.py中urlpatterns添加path('test_mw/',views.test_mw),
结果;
中间件执行总流程;
CSRF攻击
#views.py代码:
def test_csrf(request):
if request.method == 'GET':
return render(request,'test_csrf.html',locals())
elif request.method == 'POST':
return HttpResponse('test is ok !')
#urls.py代码:
path('test_csrf/',views.test_csrf),
#test_csrf.html代码:
Document
这样就可以实现不用注释掉'django.middleware.csrf.CsrfViewMiddleware',也可以实现表单的请求了



