• drf版本控制 缓存


      RESTful规范中规定了路由中应该携带api版本号

      内置的版本控制的类:

        我们只会用到QueryParameterVersioning或者URLPathVersioning这两种类

        #基于url的get传参方式:QueryParameterVersioning---->如:/users?version=v1

        #基于url的正则方式: URLPathVersioning--->/v1/users/

        #基于accept请求头方式:AcceptHeaderVersioning----->Accept:application/json:version=1.0

        #基于主机名方法:HostNameVersioning --->v1.example.com

        #基于django路由系统的namespace: NamespaceVersioning---->example.com/v1/users/

      用法:

        局部使用

        #在CBV类中加入

        versioning_class=URLPathVersioning

        这里注意不再像认证.权限.频率那样,这里就是一个类,不再是列表

        全局使用

        REST_FRAMEWORK = {

          'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',       'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值)       'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许访问的版本

          'VERSION_PARAM': 'version' # URL中获取值的key

        }

        示例:

        #路由层

        from django.conf.urls import url,include

        from web.views import TestView

        urlpatterns = [

          url(r'^(?P<version>[v1|v2]+)/rest/',TestView.as_view(),name='test'),

        ]

        #视图层

        from rest_framework.views import APIView

        from rest_framework.response import Response

        from rest_framework.versioning import URLPathVersioning

        class TestView(APIView):

          versioning_class = URLPathVersioning

          def get(self,request,*args,**kwargs):

            #获取版本

            print(request.version)

            #获取版本管理的类

            print(request.versioning_scheme)

            #反向生成URL

            reverse_url = request.versioning_scheme.reverse('test',request=request)

            print(reverse_url)

            return Response('GET请求,响应内容')

      缓存介绍

        在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增删查改渲染模版,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时候,每一次的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.缓存是将一些常用的数据保存内存或者mamcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去的数据,然后返回给用户.

      如何提高网站并发量?

        -cdn加速:把静态资源放到别人服务器

        -精灵图

        -后台数据库用mysql+redis

        -数据库的优化:sql的优化,索引,分库分表,读写分离

        -用缓存

        -程序架构

          -集群化的部署

          -分布式+异步    celery:分布式异步任务框架

        -语言

      Django的6中缓存方式

        1.开发调试缓存(不做任何操作,是假的)

        2.内存缓存

        3.文件缓存

        4.数据库缓存

        5.Memcache缓存(使用python-memcached模块)

        6.Memcache缓存(使用pylibmc模块)

      6种缓存的配置

        开发调试模式

    CACHES = { 
        'default': { 
            'BACKEND':             
            'django.core.cache.backends.dummy.DummyCache', # 缓存后台使用的引擎 
            'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期) 
            '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.filebased.FileBasedCache', # 指定缓存使用的引擎 
            'LOCATION': '/var/tmp/django_cache', # 指定缓存的路径 
            '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) } } }

        ps:创建缓存的数据库表使用的语句:

        python manage.py createcachetable

        Memcache缓存(使用python-memcached模块连接memcache)

        Memcache是Django原生支持的缓存系统,要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmc

        

    CACHES = { 
        'default': { 
            'BACKEND': 
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎 
            'LOCATION': '192.168.10.100:11211', # 指定Memcache缓存服务器的IP地址和端口'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 
            'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }

        关于LOCATION:

        可以配置成下列形式

        'LOCATION':'unix:/tmp/memcached.sock,#指定局域网内的主机名加socked套接字为Memcache缓存服务器

        'LOCATION':[#指定一台或多态其他主机ip地址加端口为Memcache缓存服务器    

        '192.168.10.100:11211',
        '192.168.10.101:11211',
        '192.168.10.102:11211',

        ]

        Memcache缓存(使用pylibmc模块连接memcache)

        

    CACHES = { 
        'default': { 
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', # 指定缓存使用的引擎 
            'LOCATION': '192.168.10.100:11211', # 指定Memcache缓存服务器的IP地址和端口'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 
            'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }

        关于LOCATION:

          可以配置成下列形式

        'LOCATION':'/tmp/memcached.sock',#指定某个路径为缓存目录

        'LOCATION':[# 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值

        '192.168.10.100:11211',

        '192.168.10.101:11211',
        '192.168.10.102:11211',

        ]

        重点:Memcached是基于内存的缓存,数据存储在内存中,所以如果服务器死机的话,数据就会丢失,所以Memcached一般与其他缓存配合使用

        Django中的缓存应用

        分为三种粒度

        1.全站缓存

        2.单页面缓存

        3.单页面局部缓存

        

    # 单页面缓存 # 在视图层返回页面时增加一个装饰器就可以实现单页面缓存 from django.views.decorators.cache import cache_page import time from .models import * 
    @cache_page(15) #超时时间为15秒 
    def index(request):   
        t=time.time() #获取当前时间   
        bookList=Book.objects.all()   
        return render(request,"index.html",locals())
    <!-- 单页面局部缓存 --> 
    <!-- 使用cache标签, 需要先load过来 --> 
    {% load cache %} 
    <!DOCTYPE html> 
    <html lang="en"> 
    <head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
    </head> 
    <body> 
    <h3 style="color: green">
    不缓存:-----{{ t }}</h3> 
    <!-- 页面中被cache标签包裹的就会被缓存 --> 
    {% cache 2 'name' %} 
    <h3>缓存:-----:{{ t }}</h3> 
    {% endcache %} 
    </body> 
    </html>
    # 缓存整个站点 
    在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件 MIDDLEWARE_CLASSES = ( 
    # 存入缓存, 重写了process_response方法 ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 'django.middleware.common.CommonMiddleware', 
    # 取出缓存并直接返回, 重写了process_request方法 ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后 
    ) 
    “update” 必须配置在第一个 
    “fetch” 必须配置在最后一个
  • 相关阅读:
    JS 删除web sql 数据表
    JS 新建web sql 数据表
    JS 更新web sql 数据表的数据
    JS 删除一行web sql 数据表的数据
    JS 向web sql数据表插入数据
    JS 打开or连接web sql数据库
    JS 获取表单数据存入数组
    JS 限制小数点位数
    JS 通过id获取DOM对象--减少代码
    mvc “System.NullReferenceException”类型的异常在 App_Web_zo44wdaq.dll 中发生,但未在用户代码中进行处理 其他信息: 未将对象引用设置到对象的实例。
  • 原文地址:https://www.cnblogs.com/xiaocaiyang/p/10457747.html
Copyright © 2020-2023  润新知