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” 必须配置在最后一个

 

posted @ 2019-03-01 19:39  小菜鸟张阳阳  阅读(303)  评论(0编辑  收藏  举报