Rest Framework-版本控制-Django缓存机制-跨域问题

本文介绍了Django Rest Framework中如何进行版本控制,详细讲解了Django的缓存机制,包括3种粒度和6种缓存方式,并通过实例展示了如何实现缓存。此外,还探讨了跨域问题,解释了同源策略和CORS,区分了简单请求与非简单请求,并提出了处理跨域问题的方法。
摘要由CSDN通过智能技术生成

一、版本控制
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',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值