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