并发
''' 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' 字段