zoukankan      html  css  js  c++  java
  • django restframework版本和认证

    封装request

    请求分发之前先执行initial方法,其中的参数request是封装后的request对象

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

    版本

    基于url的get传参方式

    如:/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',
    }
    

    源码流程



    认证

    使用

    什么是认证?认证就是认证身份,身份就是你是不是网站的注册用户还是游客。在登陆的时候,登陆成功给浏览器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",]
    }
    

    源码流程




    认证失败

    全局配置认证失败

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

    REST_FRAMEWORK = {
        "UNAUTHENTICATED_USER":lambda :'xxx'
    }
    
  • 相关阅读:
    (转载)Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
    Android事件分发和消费机制(转载)
    Android动画及滑动事件冲突解决(转载)
    写在学习Oracle之前
    laragon yii
    ubuntu使用bower install问题汇总
    LNMP架构下访问php页面出现500错误
    form表单提交无页面刷新(非js)
    Firefox浏览器无法安装插件的解决
    完美解决 Ubuntu 下 Sublime Text 2配置搜狗拼音输入法
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9385396.html
Copyright © 2011-2022 走看看