一、版本控制
from rest_framework.request import Request
from rest_framework.views import APIView
from rest_framework.parsers import JSONParser
from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning,AcceptHeaderVersioning
class VersionTest(APIView):
parser_classes=[JSONParser]
versioning_class=AcceptHeaderVersioning
def get(self, request,*args,**kwargs):
print(request.version)
print(request.versioning_scheme)
return Response()
'''
# 版本控制
-内置的类
QueryParameterVersioning 基于get传参的方式
AcceptHeaderVersioning 基于请求头的
NamespaceVersioning 基于名称空间的
URLPathVersioning 基于正则的方式(推荐)
-局部使用
在视图类中配置
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
}
-例外:
用基于正则的方式,需要修改urls.py
url(r'^(?P<version>[v1|v2]+)/versiontest/', views.VersionTest.as_view()),
-在视图类的方法中可以取出版本号
reques.version
'''
二、Django缓存机制
缓存介绍:
在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增、删、查、改、渲染模板,执行业务逻辑,最后生成用户看到的页面。
当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力。
缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。
3种粒度:
1. 全站缓存
2. 单页面缓存
3. 页面中局部缓存
6种缓存方式:
1. 开发调试缓存
2. 内存缓存
3. 文件缓存
4. 数据库缓存
5. Memcache缓存(使用python-memcached模块)
6. Memcache缓存(使用pylibmc模块)
经常使用的有文件缓存和Mencache缓存
Django中使用缓存(缓存到文件举例):
# settings中配置
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)
}
}
}
单页面缓存(使用装饰器):
# 视图层
from django.views.decorators.cache import cache_page
# 代表缓存5s
@cache_page(5)
def cache_test(request):
print('走视图函数')
ctime=time.time()
return render(request,'index.html',locals())
页面局部缓存:
{ % load cache %}
# 传两个参数:第一个参数是超时时间,第二个参数是key值,唯一的标志#
{ % cache 5 'ttt' %}
当前时间是:{{ ctime }}
{ % endcache %}
-缓存存储的数据格式
unique_snowflake = {
'index': asdfafasfasf,
'test': aerafdgerytwrega,
'ttt': saefasfaefqwe,
'yyy': asdfasfdsad,
}
全站缓存(配置中间件):
# 在settings中配置两个中间件
'django.middleware.cache.UpdateCacheMiddleware'
..........
'django.middleware.cache.FetchFromCacheMiddleware'
# 配置缓存时间
CACHE_MIDDLEWARE_SECONDS=10
三、跨域问题
同源策略:
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现
请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名、端口、协议相同。
比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据
浏览器上就会报错,个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险
CORS两种请求详细
# 简单请求和非简单请求
只要符合如下两大条件,就是简单请求,否则是非简单请求
1. 请求方法是以下三种方法之一:
HEAD
GET
POST
2. HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
简单请求和非简单请求的区别
简单请求:一次请求
非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
处理跨域问题:
------------------------------mycsrf.py--------------------------
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware(MiddlewareMixin):
def process_response(self,request,response):
#处理了简单请求
response['Access-Control-Allow-Origin'] = '*'
#处理非简单请求
if request.method=='OPTIONS':
response['Access-Control-Allow-Headers']='*'
# response['Access-Control-Allow-Methods']='PUT,PATCH'
response['Access-Control-Allow-Methods']='*'
return response
# 在settings.py中配置
# 处理跨域问题的中间件
'app01.mycsrf.MyMiddleware',