ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

缓存及跨域问题

2019-07-08 23:02:17  阅读:191  来源: 互联网

标签:缓存 跨域 300 cache django 问题 response 请求


django中的缓存

django的缓存方式:缓存的位置

  • ​ 开发调试阶段:没有缓存
  • ​ 缓存到内存中
  • ​ 缓存到数据库中
  • ​ 缓存到文件中
  • ​ 缓存到redis

缓存位置的配置(在settings中配置,BACKEND不同,缓存的位置不同):

文件缓存

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

内存缓存(将缓存内容保存至内存区域中)

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
  'LOCATION': 'unique-snowflake',         # 写在内存中的变量的唯一值 
  'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
  'OPTIONS':{
   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  }  
 }
}

数据库缓存

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

缓存粒度

  • ​ 全站缓存
  • ​ 单页面缓存
  • ​ 局部缓存

缓存使用

1.配置settings文件,把cache配置进去

2.单页面缓存:在视图函数上加一个装饰器

from django.views.decorations.cache import cache_page

@cache_page(5)  # 5代表缓存时间

3.局部缓存

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

4.全站缓存

在settings中配置两个中间件:注意顺序

'django.middleware.cache.UpdateCacheMiddleware',  # 第一个
.........
'django.middleware.cache.FetchFromCacheMiddleware'  # 最后

# 配置一个超时时间
CACHE_MIDDLEWARE_SECOEDS = 5

5.高级用法

前后端分离

from django.core.cache import cache
cache.set('test_data',{'name':'lucas','age':18},5)

cache.get('test_data')

跨域问题

浏览器的同源策略:拒绝不是当前域返回的数据

同域:ip地址和端口号都相同才是同一个域

如何解决跨域问题:

  • CORS:跨域资源共享
  • 简单请求:发一次请求
  • 非简单请求:非简单请求是发送了两次请求,第一次是预检请求(OPTIONS请求),当预检通过,再发送真实的请求

自定义中间件:

from django.utils.deprecation import MiddlewareMixin
class MyCorsMiddle(MiddlewareMixin):
    def process_response(self,request,response):
        if request.method == 'OPTIONS':
            # 允许它,非简单请求
            response['Access-Control-Allow-Headers'] = 'Content-Type'
            # 允许所有header访问
            # response['Access-Control-Allow-Headers'] = '*'
            
            # 简单请求
        response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000'
            # 所有的域都允许访问
            # response['Access-Control-Allow-Origin'] = '*'
        return response
            

写完在settings中间件中配置一下

'app01.MyMiddle.MyCorsMiddle'  # 最好放在第一个

别人写的cors-headres(在我的博客Rest Framework中涉及到)

补充:

自己封装response:

根据get_paginated_response的想法自己来封装response

from rest_framework.response import Response
class MyResponse():
    def __init__(self):
        self.code = 100
        self.msg = None
        
    def get_response(self):
        return Response(self.__dict__)
class Test(APIView):
    def get(self,request,*args,**kwargs)
    response = MyResponse()
    response.data = {'name':'lucas','age':'18'}
    response.code = 100
    response.msg =  '查询成功'
    return response.get_response()

图片防盗链:

​ 可以通过refer控制

​ nginx处理

如何提高网站的并发量:

​ QPS:Queries Per Second意思是'每秒查询率',是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准

​ TPS:是TransactionsPerSecond的缩写,也就是事务数/秒,它是软件测试结果的测量单位,一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程,客户机在发送请求时计时,收到服务器响应结束计时,以此来计算使用的时间和完成的事务个数

提高方法:

前端:

  • 使用cdn
  • 精灵图
  • 页面本地缓存

后端:

  • Nginx做负载均衡,后台服务器做集群化的部署
  • 后台缓存
  • 数据库主从同步
  • 读写分离
  • 异步处理(celery:分布式的异步任务框架)

标签:缓存,跨域,300,cache,django,问题,response,请求
来源: https://www.cnblogs.com/yanminggang/p/11154579.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有