并发

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

 

 posted on 2019-05-27 19:28  HeiTangMuSi  阅读(161)  评论(0编辑  收藏  举报