• 缓存及跨域问题


    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:分布式的异步任务框架)
  • 相关阅读:
    Modelsim中观测代码覆盖率
    Allegro中Thermal relief Pad 和Anti Pad
    时序逻辑中阻塞赋值引起的仿真问题
    如何提高FPGA工作频率(转载)
    `include在Verilog中的应用
    forever
    wxpython 应用 使用 google gauth 认证
    sql to sqlalchemy 转换
    django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务
    simpletodo: 一个简易的 todo 程序 django版
  • 原文地址:https://www.cnblogs.com/yanminggang/p/11154579.html
Copyright © 2020-2023  润新知