django中的缓存

先来了解以下问题?(面试会问)

如何提高网站的并发量:   QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。   TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数  使用cdn(静态文件放在别人的服务器,减少你的服务器的压力)图片防盗链-请求头里有refer,标志的从哪个地方跳到我这里来的,计算引流(我这个网站给你这个网站做了膏,从我网站一点就跳到你网站去,它就会携带refer信息,人家一统计你这个网站是跳到我这个网站来的,说明你给我引了流量过来的,我需要给你付费)-nginx处理-精灵图:一个页面有十个小图就得发十个请求,它就将十个小图拼成一个图发一个请求,然后根据我的定位,给我定到一个地方,所以你看到的是就是显示的图-页面本地缓存(请求次数减少)-nginx做负载均衡,后台服务做集群化的部署-后台缓存(django中的缓存)-数据库的主从同步-读写分离-异步处理(celery:分布式的异步任务框架)

一 缓存介绍

在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.

当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.

缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.

二 Django中的6种缓存方式

  • 开发调试缓存:没有缓存
  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)
  • 缓存到redis

经常使用的有文件缓存和Mencache缓存

1.2.3 文件缓存(把缓存数据存储在文件中)

settings.py文件配置

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎'LOCATION': '/var/tmp/django_cache',        #指定缓存的路径'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)'OPTIONS':{'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }}
}

View Code

1.2.4 数据库缓存(把缓存数据存储在数据库中)

settings.py文件配置

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎'LOCATION': 'cache_table',          # 数据库表    'OPTIONS':{'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }  }
}

View Code

注意,创建缓存的数据库表使用的语句:

python manage.py createcachetable

-缓存位置的配置(在setting中配置,BACKEND不同,缓存的位置不同):   CACHES = {      'default': {         'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 指定缓存使用的引擎         'LOCATION': 'D:\lqz\cache',  # 指定缓存的路径         'TIMEOUT': 300,  # 缓存超时时间(默认为300秒,None表示永不过期)         'OPTIONS': {            'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)            'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)         }      }   }
-缓存粒度   -全站缓存   -单页面缓存   -局部缓存


单页面缓存?views.py
from django.shortcuts import render# Create your views here.from django.views.decorators.cache import cache_page
import time@cache_page(5)
def index(request):ctime = time.time()return render(request, 'index.html',{'time':ctime})

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script><link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script><link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
{{ time }}
</body>
</html>

url.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/',views.index)
]

-缓存使用:    -1 配置setting文件,把cache配置进去   -2 单页面缓存:在视图函数上加一个装饰器      from django.views.decorators.cache import cache_page      @cache_page(5)    5 代表缓存时间
局部缓存?

from django.shortcuts import render# Create your views here.from django.views.decorators.cache import cache_page
import time@cache_page(5)
def index(request):ctime = time.time()return render(request, 'index.html',{'time':ctime})

views.py

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script><link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script><link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
{% load cache %}
{% cache 5 'test' %}
当前时间{{ time }}
{% endcache %}
</body>
</html>

index.html

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/',views.index)
]

urls.py

- 局部缓存   {% load cache %}   {% cache 5 'test'%}    第一个参数表示缓存时间,第二个参数是key值(取缓存的时候,需要根据key值取)      当前时间:{{ time }}   {% endcache %}
全站缓存?

既然是全站缓存,当然要使用Django中的中间件.

用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户

当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存

缓存整个站点,是最简单的缓存方法在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件
MIDDLEWARE_CLASSES = (‘django.middleware.cache.UpdateCacheMiddleware’, #第一'django.middleware.common.CommonMiddleware',‘django.middleware.cache.FetchFromCacheMiddleware’, #最后
)
“update” 必须配置在第一个
“fetch” 必须配置在最后一个

修改settings.py配置文件

MIDDLEWARE_CLASSES = ('django.middleware.cache.UpdateCacheMiddleware',   #响应HttpResponse中设置几个headers'django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.auth.middleware.SessionAuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','django.middleware.security.SecurityMiddleware','django.middleware.cache.FetchFromCacheMiddleware',   #用来缓存通过GET和HEAD方法获取的状态码为200的响应

)CACHE_MIDDLEWARE_SECONDS=10

View Code

视图函数:

from django.views.decorators.cache import cache_page
import time
from .models import *def index(request):t=time.time()      #获取当前时间bookList=Book.objects.all()return render(request,"index.html",locals())def foo(request):t=time.time()      #获取当前时间return HttpResponse("HELLO:"+str(t))

模板(index.html):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3 style="color: green">当前时间:-----{{ t }}</h3><ul>{% for book in bookList %}<li>{{ book.name }}--------->{{ book.price }}$</li>{% endfor %}
</ul></body>
</html>

其余代码不变,刷新浏览器是10秒,页面上的时间变化一次,这样就实现了全站缓存.

test是干啥用的:根据key值来取,一个页面有十个缓存,全叫test可以吗?这就全都乱套了,在局部缓存,没写这个key,那是根据什么来的,我这里没有存值,而缓存一定会有key对应的字符串 ,就是根据路由 
- 高级用法

Create your views here.
from rest_framework.views import APIView
from app01.utils import MyRespone
class Test(APIView):def get(self,request):response=MyRespone()response.data={'name':'lqz','age':18}response.code=100response.msg='查询成功'return response.get_response()

views.py

from rest_framework.response import Response
class MyRespone():def __init__(self):self.code=100self.msg=Nonedef get_response(self):return Response(self.__dict__)

utils.py

将以上的response.data取值方式改为以下   -前后端分离项目(保存数据,序列化之后的data)      -设置值跟取值:         cache.set('test_data',{'name':'lqz','age':18},5)         cache.get('test_data')
 

跨域问题

-浏览器的:同源策略,浏览器拒绝不是当前域域返回的数据-ip地址和端口号都相同才是同一个域-如何解决:   -CORS:跨域资源共享   -简单请求:发一次请求   -非简单请求:非简单请求是发送了两次请求,第一次是预检请求(OPTIONS请求),当预检通过,允许我发请求,再发送真实的请求-解决跨域问题:(写好这个中间件配置一下)   class MyCorsMiddle(MiddlewareMixin):      def process_response(self, request, response):         if request.method == 'OPTIONS':            # 允许它            response['Access-Control-Allow-Headers'] = 'Content-Type'            # obj['Access-Control-Allow-Headers']='*'

            # obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000'         response['Access-Control-Allow-Origin'] = '*'         return response-别人写的cors-headers(了解一下)

redis的安装和简单使用

-内存数据库   -Redis-x64-3.2.100---》mysql   -redis-desktop-manager-0.9.3.817----》navcate-安装完后   -redis-server  服务端   -redis-cli   客户端

转载于:https://www.cnblogs.com/huangxuanya/p/11157531.html

django中的缓存以及跨域相关推荐

  1. Django中使用CORS实现跨域请求

    跨域请求: ​    请求url包含协议.网址.端口,任何一种不同都是跨域请求. 1.安装cors模块 pip install django-cors-headers 2.添加应用 INSTALLED ...

  2. django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决

    django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决 参考文章: (1)django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决 (2)https://www.cnblog ...

  3. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)

    阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...

  4. 详解nginx代理天地图做缓存解决跨域问题

    这篇文章主要介绍了详解nginx代理天地图做缓存解决跨域问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 作为一个GISer开发者,天地图是经常在项目中以底图的形式出现 ...

  5. Tomcat中的字体请求跨域问题解决

    Tomcat中的字体请求跨域问题解决 原作者地址: https://blog.csdn.net/u011974399/article/details/79990505 修改tomcat的web.xml ...

  6. SpringMVC中的异步请求-跨域访问

    发送异步请求: <%@page pageEncoding="UTF-8" language="java" contentType="text/h ...

  7. 后端传输流跨域_Java开发中解决Js的跨域问题过程解析

    这篇文章主要介绍了Java开发中解决Js的跨域问题过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主流方法有JSONP和CORS两种,这里记 ...

  8. Django中的缓存

    缓存 什么是缓存? 缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式.一般用来存储临时数据,常用介质的是读取速度很快的内存 为什么使用缓存? 视图渲染有一定成本,对于低频变动 ...

  9. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)

    二.跨域: 回到顶部 跨域知识介绍: 点我以前博客 跨域解决方法:CORS:跨域资源共享 CORS请求分类(简单请求和非简单请求) 简单请求(simple request):只需要在头信息之中增加一个 ...

最新文章

  1. php5.3二进制包,php使用pack处理二进制文件的方法
  2. python 怎么验证是否安装成功 scrapy
  3. hbase集群重启后异常删除zookeeper中的元数据
  4. modprobe:FATAL: could not load /lib/modules/2.6.35-22-generic/modules.dep No such file or directory
  5. Gradle入门:集成测试
  6. springboot entity date_「Java」 - SpringBoot amp; JPA多数据源
  7. dpkg status database is locked by another process
  8. DedeCMS高仿老版chinaz站长网模板
  9. ubuntu14.04+ROS indigo+kinectV1 骨骼点检测
  10. Algorand基金会与Brixton Pound达成合作关系,将开发布里克斯顿英镑的通证化版本
  11. AtCoder Beginner Contest 136 解题报告
  12. oracle季度日均怎么算,求日均值,该如何处理
  13. 小米手机是什么系统?
  14. c语言课程设计黄金矿工,unity简易版黄金矿工源码
  15. redis cli命令详解
  16. java的round函数加点差_【JAVA】Math.Round()函数常见问题“四舍5入”
  17. unity gizmo在游戏中绘制_world machine中文版下载_三维游戏地形软件pc版免费下载3.3026...
  18. C# windows窗口应用程序切换主界面的显示内容
  19. android 调用oracle,Android 调用WCF实例详解
  20. 容器化 Spring Boot 代码的 9 个技巧

热门文章

  1. Fast Stone超好用的截图工具,可截取长图,带滚动条的页面
  2. 接口自动化实现图片上传(selenium/RF)
  3. [转载]Google Guava官方教程(中文版)
  4. [javaSE] 多线程(join方法)
  5. CentOS安装PPTP ×××
  6. PL/SQL 基础( 上 )
  7. 跟小段一起学Solaris(20)---ipFilter防火墙
  8. nas servers
  9. success or not?
  10. pycharm和vs code的使用体验