django中的缓存以及跨域
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)
}
}
}
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)
}
}
}
注意,创建缓存的数据库表使用的语句:
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
视图函数:
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=100
response.msg='查询成功'
return response.get_response()
views.py
from rest_framework.response import Response
class MyRespone():
def __init__(self):
self.code=100
self.msg=None def 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 客户端
django中的缓存以及跨域的更多相关文章
- django中同源策略和跨域解决方案
一 同源策略 1.1何谓同源? 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同 ...
- Django中使用CORS实现跨域请求(转)
原文:https://blog.csdn.net/zizle_lin/article/details/81381322 跨域请求: 请求url包含协议.网址.端口,任何一种不同都是跨域请求. ...
- Django中使用CORS实现跨域请求
跨域请求: 请求url包含协议.网址.端口,任何一种不同都是跨域请求. 1.安装cors模块 pip install django-cors-headers2.添加应用 INSTALLED_ ...
- Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)
一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...
- 版本控制,django缓存,跨域问题解决
复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...
- js中ajax如何解决跨域请求
js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...
- Web API中使用CORS解决跨域
Web API中使用Cros解决跨域 如果两个页面的协议,端口和域名都相同,则两个页面具有相同的源,注:IE不考虑端口,同源策略不会阻止浏览器发送请求,但是它会阻止应用程序看到响应.如下图所示 COR ...
- Django中的缓存(内存,文件,redis)
一.Django中的缓存的几种方法 1)单个视图缓存.时间测试 import time from django.views.decorators.cache import cache_page @ca ...
- spring boot 中通过CORS实现跨域
一.跨域问题出现的原因 出现跨域问题的原因是同源策略. 同源策略 主要是三同:同协议.同域名.同端口, 同源策略目的 保证用户信息安全,防止恶意网站窃取数据.同源策略是必须的,否则cookie可以共享 ...
随机推荐
- angular知识点(2)
angular知识点(2) 1.为了代码规范,对于需要自动加载的依赖,需要在前面加上注释,注释为://@ngInject 或者是/*@ngInject*/ 2.ngSwitch的应用 在需要用到选择出 ...
- JavaWeb中遇到的字符编码问题
一.常见的编码方式 1.UTF-8 2.ISO-8859-1 二.Tomcat的编码问题 Tomcat8和7的编码方式 Tomcat7对URI默认编码是ISO-8859-1 Tomcat8对URI默认 ...
- Hello World!(这不是第一篇)
如题,这不是第一篇blog,但是为了表示这个闲置了1年多的blog现在被我正式启用了,我还是走个过场吧. #include <iostream> using namespace std; ...
- AAAI |如何保证人工智能系统的准确性?
|如何保证人工智能系统的准确性?" title="AAAI |如何保证人工智能系统的准确性?"> 注:本文译自AI is getting smarter; ...
- IIS+PHP+Mysql 返回500,服务器内部资源问题
这个错误困扰了我好久.... 尝试了好多方法都不管用,最后突然发现我的代码是: <?php $link=mysql_connect("localhost","xxx ...
- Python知识点汇总
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Tomcat生产环境应用
概要: Tomcat各核心组件认知 Tomcat server.xml 配置详解 Tomcat IO模型介绍 一.Tomcat各组件认知 Tomcat架构说明 Tomcat组件及关系详情介绍 Tomc ...
- python django 之 django自带的分页
1. 例1: 基础的分页 1). vim app01/views.py def users(request): from django.core.pagina ...
- 读书笔记-《Mysql技术内幕》
MYSQL 技术内幕 Mysql体系 连接池组件 管理服务和工具 SQL接口 查询分析器 优化器 缓冲 插件式存储引擎 物理文件 存储引擎 InnoDB(默认引擎) 支持事务 行锁设计 多版本并发控制 ...
- LeetCode--二叉树1--树的遍历
LeetCode--二叉树1--树的遍历 一 深度遍历 深度遍历里面由 三种遍历方式,两种实现方法.都要熟练掌握. 值得注意的是,当你删除树中的节点时,删除过程将按照后序遍历的顺序进行. 也就是说,当 ...