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

一、版本控制
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',
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django REST framework (DRF) 可以使用 Token 认证、Session 认证和 JSON Web Token (JWT) 认证等方式进行登录验证。 其中,Token 认证和 Session 认证是最基本的认证方式,它们都使用了 Django 自带的用户认证系统,适合于简单的应用场景。Token 认证是通过在请求头中添加 Token 来进行认证,而 Session 认证则是在 Cookie 中保存 Session ID 来进行认证。 JWT 认证则是一种更加灵活和安全的认证方式,它使用了基于 JSON 的 Token,可以完全脱离 Django 自带的用户认证系统,支持跨域访问和分布式系统。JWT 认证需要在 DRF 中添加相应的中间件和配置,同时也需要在前端实现 Token 的生成和保存。 在 DRF 中使用 Token 认证或 Session 认证,只需要在 settings.py 文件中添加相应的认证方式,如: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], } ``` 在视图函数中使用 `@authentication_classes` 装饰器来指定认证方式,如: ```python from rest_framework.decorators import authentication_classes from rest_framework.authentication import TokenAuthentication, SessionAuthentication @authentication_classes([TokenAuthentication, SessionAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` JWT 认证需要使用第三方库 `djangorestframework-jwt`,并在 settings.py 文件中添加相应的配置,如: ```python INSTALLED_APPS = [ # ... 'rest_framework', 'rest_framework_jwt', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), } JWT_AUTH = { 'JWT_SECRET_KEY': 'your_secret_key', 'JWT_ALGORITHM': 'HS256', 'JWT_ALLOW_REFRESH': True, 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30), } ``` 在视图函数中使用 `@jwt_authetication_classes` 装饰器来指定 JWT 认证方式,如: ```python from rest_framework_jwt.authentication import JSONWebTokenAuthentication from rest_framework.decorators import jwt_authetication_classes @jwt_authetication_classes([JSONWebTokenAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` 以上是 DRF 中常见的登录验证方式,可以根据具体的应用场景选择合适的认证方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值