缓存及跨域问题

Posted yanminggang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存及跨域问题相关的知识,希望对你有一定的参考价值。

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:分布式的异步任务框架)

以上是关于缓存及跨域问题的主要内容,如果未能解决你的问题,请参考以下文章

Ajax及跨域

同源策略及跨域的问题

父页面操作iframe子页面的安全漏洞及跨域限制问题

单点登录认证原理及跨域cookie共享

使用vue-element-admin框架调用后端接口及跨域问题

Flutter Web:图片相关及跨域问题