栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django(缓存和中间件)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django(缓存和中间件)

缓存场景:

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


   
    
{% csrf_token %}

 这样就可以实现不用注释掉'django.middleware.csrf.CsrfViewMiddleware',也可以实现表单的请求了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/829008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号