并发
'''
1.CDN:一些第三方的静态文件直接访问别人的服务器
2.精灵图:将多个小图通过UI人员拼接成一张大图,降低请求图片资源的次数
3.数据库:可以缓存的数据,就只存在redis,将一些必须在硬盘的数据才存放在MySql,如果需要缓存,还可以利用redis做硬盘数据的内存缓存
4.数据库自身的优化:sql优化|索引|分库分表|读写分离
5.缓存:数据可以缓存,文件也可以缓存、页面也可以缓存,甚至整个项目都可以缓存
6.架构:
集群部署:nginx可以完成
动静分离(静态资源请求专门存放静态文件的服务器)
负载均衡(多个请求均分配给多个横向部署的服务器)
分布式异步队列:clery分布异步框架,一个请求分多步处理用一个队列整体管理
'''
缓存
'''
缓存可以存放在:文件、数据库、内存中,通常我们开发是将缓存存放在内存的数据库中
内存的数据库:redis与memcache
'''
Django中缓存的配置
CACHES = {
'default': {
# 指定缓存使用的引擎
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
# 写在内存中的变量的唯一值
'LOCATION': 'unique-snowflake',
# 缓存超时时间(默认为300秒,None表示永不过期)
'TIMEOUT': 300,
'OPTIONS': {
# 最大缓存记录的数量(默认300)
'MAX_ENTRIES': 300,
# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
'CULL_FREQUENCY': 3,
}
}
}
三种粒度缓存
# 页面局部
""" 由Django渲染的页面
{% load cache %}
{% cache 10 'name' %}
<p>要被缓存的局部内容</p>
{% endcache %}
"""
# 单个页面
from django.views.decorators.cache import cache_page
@cache_page(10) # 代表该视图函数渲染的页面被缓存10s
def test_cache(request):
import time
c_time = time.time()
return render(request, 'cache.html', locals())
# 全站缓存
MIDDLEWARE = [
# 响应HttpResponse中设置几个headers(必须放在最上方)
'django.middleware.cache.UpdateCacheMiddleware',
# ...
# 用来缓存通过GET和HEAD方法获取的状态码为200的响应(必须放在最下方)
'django.middleware.cache.FetchFromCacheMiddleware',
]
# 缓存的时间秒数
CACHE_MIDDLEWARE_SECONDS = 10
Redis缓存处理Token
登录的视图函数
# uitls.py
import uuid
def get_token():
return uuid.uuid4().hex
# views.User.py
class TestToken(ModelViewSet):
authentication_classes = [auth.LoginAuthenticate]
def get(self, request, *args, **kwargs):
api_response = ApiResponse()
api_response.message = '认证通过'
return Response(api_response.api_dic)
from django.core.cache import cache
class UserView(ModelViewSet):
def login(self, request, *args, **kwargs):
api_response = ApiResponse()
user = models.User.objects.filter(**request.data).first()
if user:
# 登录成功操作token
token = get_token()
# cache对象是缓存模块中的对象,采用的缓存引擎为redis,
# 那cache就可以作为redis对象直接操作redis数据库,取值也要对应cache取
object = {
'user': user,
'token': token
}
import pickle
token_object = pickle.dumps(object)
cache.set(token, token_object, 100)
user_data = objectjson.UserJson(user).data
api_response.message = 'login success'
api_response.token = token
api_response.results = user_data
return Response(api_response.api_dic)
api_response.status = 1
api_response.message = 'login failed'
return Response(api_response.api_dic)
# urls.py
urlpatterns = [
url(r'^login/', views.UserView.as_view({'post': 'login'})),
url(r'^token/', views.TestToken.as_view({'get': 'get'})),
]
认证类的登录认证
from django.core.cache import cache
class LoginAuthenticate(BaseAuthentication):
def authenticate(self, request):
token = request.META.get('HTTP_TOKEN')
token_data = cache.get(token)
# 拿redis数据库缓存token
if not token_data:
raise AuthenticationFailed('认证失败')
# token没有过期,将pickle序列化的数据反序列化后使用
import pickle
token_object = pickle.loads(token_data)
user = token_object['use
前端发送登录后的请求
vue的组件
<!--VIP.vue-->
<template>
<div class="vip">
<h2>VIP 功能特区</h2>
<p @click="atcion">登录后操作的功能</p>
<p>{{ msg }}</p>
</div>
</template>
<script>
export default {
name: "VIP",
data: function () {
return {
msg: ''
}
},
methods: {
atcion: function () {
let token = this.$cookie.get('token');
// window.alert(token);
if (token) {
// window.alert("登录后的请求")
let _this = this;
this.$ajax({
method: 'get',
url: this.$base_api + 'token/',
headers: {
TOKEN: token
}
}).then(function (response) {
_this.msg = response.data
})
} else {
window.alert("先登录")
}
}
}
}
</script>
<style scoped>
</style>
后台CORS中间件
from corsheaders.middleware import CorsMiddleware
# 该中间件包中defaults.py文件default_headers加入加入 'token' 字段