django restframework版本和认证

封装request

请求分发之前先执行initial方法,其中的参数request是封装后的request对象
1112571-20180729152148472-710466879.png
1112571-20180729152403992-994102593.png

在initial(request)的外层有异常捕获,即使认证,权限,节流raise错误也无关紧要。这些组件就是通过raise错误来表示认证失败等
1112571-20180729162853789-422263629.png

版本

基于url的get传参方式

1112571-20180729155131038-849799060.png

如:/users?version=v1
settings的配置

REST_FRAMEWORK = {
    'DEFAULT_VERSION': 'v1',            # 默认版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],   # 允许的版本
    'VERSION_PARAM': 'version'          # URL中获取值的key
}

urls.py

from django.conf.urls import url, include
from .views import UserView

urlpatterns = [
    url(r'^user/', UserView.as_view(),name='user'),
]

views.py

class UserView(APIView):
    versioning_class = QueryParameterVersioning

    def get(self, request, *args, **kwargs):
        # 获取版本
        print(request.version)
        # 获取版本管理的类
        print(request.versioning_scheme)

        # 反向生成URL
        reverse_url = request.versioning_scheme.reverse('user', request=request)
        print(reverse_url)
        return Response('ok')

基于url的正则方式

如/users/v1/

urls.py

from django.conf.urls import url, include
from .views import UserView

urlpatterns = [
    url(r'^user/(?P<version>[v1|v2]+)/', UserView.as_view(),name='user'),
]

views.py

class UserView(APIView):
    versioning_class = URLPathVersioning

    def get(self, request, *args, **kwargs):
        # 获取版本
        print(request.version)
        # 获取版本管理的类
        print(request.versioning_scheme)

        # 反向生成URL
        reverse_url = request.versioning_scheme.reverse('user', request=request)
        print(reverse_url)
        return Response('ok')

一般使用第二种方式
全局配置

REST_FRAMEWORK = {
    "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
    "DEFAULT_VERSION":'v1',
    "ALLOWED_VERSIONS":['v1','v2'],
    "VERSION_PARAM":'version',
}

源码流程

1112571-20180729160237001-1267076560.png
1112571-20180729160250435-1739106197.png
1112571-20180729160324854-33667645.png

认证

使用

什么是认证?认证就是认证身份,身份就是你是不是网站的注册用户还是游客。在登陆的时候,登陆成功给浏览器token,浏览器拿到token来并在数据库检测成功说明认证通过。

vue.utils.auth.py

from rest_framework.authentication import BaseAuthentication

class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.GET.get('token')
        user_token = UserToken.objects.filter(token=token).first()
        if user_token:
            return user_token.user.name, token
        else:
            raise exceptions.AuthenticationFailed('token error')

上述返回的元组(user_token.user.name, token) 会赋值给request.user和request.auth

views.py

class UserView(ModelViewSet):
    authentication_classes = [MyAuthentication]

    queryset = User.objects.all()
    serializer_class = UserSerializer

全局使用

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["vue.utils.auth.Authentication",]
}

源码流程

1112571-20180729162423473-1020483941.png
1112571-20180729162433399-568010737.png
1112571-20180729162520643-189326363.png
1112571-20180729162545018-1793377796.png

认证失败
1112571-20180729162802523-390366956.png

全局配置认证失败

因为self.user = api_settings.UNAUTHENTICATED_USER(),能加括号要么是函数,要么是对象

REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER":lambda :'xxx'
}

转载于:https://www.cnblogs.com/longyunfeigu/p/9385396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值