当前位置: 首页 > news >正文

版本,认证,权限

            版本

DRF中版本

导入

from rest_framework.versioning import

  

全局配置版本控制系统 

/v1/books/    是在 URL加查询参数

 

# DRF的配置
REST_FRAMEWORK = {
    # 配置默认使用的版本控制类
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    'DEFAULT_VERSION': 'v1',  # 默认的版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效的版本
    'VERSION_PARAM': 'version',  # 版本的参数名与URL conf中一致
}  

URl

url(r'(?P<version>[v1|v2]+)/books/$', views.BookListView.as_view()),  

 视图:

class BookListView(ListCreateAPIView):
    """查看列表和创建"""
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer

    # 只要配置了版本 在视图中就能通过 request.version

    def get_serializer_class(self):
        """获取当前序列化类的方法"""
        # 根据版本的不同返回不同的序列化类
        print(self.request.version)
        if self.request.version == 'v1':
            return BookSerializerVersion1
        return self.serializer_class

/books/?version=v1

局部配置    一般都是全局配置

注意,通常我们是不会单独给某个视图设置版本控制的,如果你确实需要给单独的视图设置版本控制,你可以在视图中设置versioning_class属性,如下:

class PublisherViewSet(ModelViewSet):

    ...
    versioning_class = URLPathVersioning

  

             认证

 

接下类我们就自己动手实现一个基于Token的认证方案:

                自定义Token认证

        表

定义一个用户表和一个保存用户Token的表:

 

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    vip = models.BooleanField(default=False)
    token = models.CharField(max_length=128,null=True,blank=True)

url

url(r'users/',include('auth_demo.urls')),

urlpatterns = [
    url(r'reg/$',views.RegView.as_view()),
    url(r'login/$',views.LoginView.as_view()),
    url(r'test_auth/$',views.TesAuthView.as_view()),

]

登录和注册   views

from django.shortcuts import render
from rest_framework.views import APIView
from auth_demo import models
from rest_framework.response import Response
import uuid



class RegView(APIView):
    def post(self, request):
        # 获取用户注册的数据
        name = request.data.get('name')
        pwd = request.data.get('pwd')
        re_pwd = request.data.get('re_pwd')
        if name and pwd:
            if pwd == re_pwd:
                models.UserInfo.objects.create(name=name, pwd=pwd)
                return Response('注册成功')
            else:
                return Response('两次密码不正确')
        else:
            return Response('无效参数')


class LoginView(APIView):
    def post(self, request):
        name = request.data.get('name')
        pwd = request.data.get('pwd')
        if name and pwd:
            user_obj = models.UserInfo.objects.filter(name=name, pwd=pwd).first()
            if user_obj:
                # 生成token  保存在用户表,  给用户返回
                token = uuid.uuid1().hex
                user_obj.token = token
                user_obj.save()
                return Response({'error_on': 1, 'error': token})

            else:
                return Response({'error_on': 1, 'error': '用户名或密码错误'})
        else:
            return Response('无效参数') 

局部配置认证

from auth_demo.auth import MyAuth
# 登录之后才能看到的数据接口
class TesAuthView(APIView):
    authentication_classes = [MyAuth, ]  # 局部配置认证
    def get(self, request):
        return Response('这里只能是登陆后才能看到的地方')  

全局配置认证  不推荐用

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ['auth_demo.auth.MyAuth', ]
}  

自定义认证 

 

from rest_framework.authentication import BaseAuthentication
from auth_demo import models
from rest_framework.exceptions import AuthenticationFailed#别人写的抛出异常


class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        #拿到页面?后面的数据
        token = request.query_params.get('token')
        if token:
            user_obj = models.UserInfo.objects.filter(token=token).first()
            if user_obj:
                # token是有效的,记住要对象和token
                return user_obj,token
            else:
                # 抛出异常
                raise AuthenticationFailed('无效的token')
        else:
            raise AuthenticationFailed('请求的URL中必须携带token参数')

  

            权限

 自定义一个权限组件

 

from rest_framework.permissions import BasePermission
from auth_demo import models


class MyPermission(BasePermission):
    #提示
    message = '这是vip才能访问'

    def has_permission(self, request, view):
        # 如果你是VIP才有权限访问
        # request.user:当前经过认证的用户对象
        if not request.auth:    #在权限里先判断有没有通过认证
            return False
        if request.user.vip:
            return True
        else:
            return False

  

 全局配置

    'DEFAULT_PERMISSION_CLASSES': ['auth_demo.permissions.MyPermission', ] 

局部配置

 

from auth_demo.auth import MyAuth
from auth_demo.permissions import MyPermission
# 登录之后才能看到的数据接口
class TesAuthView(APIView):
    authentication_classes = [MyAuth, ]  # 局部配置认证
    permission_classes = [MyPermission, ]#局部配置权限
    def get(self, request):
        return Response('这里只能是登陆后才能看到的地方')

 

转载于:https://www.cnblogs.com/xihuanniya/p/10274339.html

相关文章:

  • 初学HTML-1
  • 实现复杂状态机的一种思路
  • 【安全测试自学】初探web安全处测试(二)
  • URAL1966 Cipher Message 3
  • windows 下使用 sc 添加创建exe服务;
  • 【[NOI2018]你的名字】
  • OmniPlan 3 Pro密钥
  • AI书单
  • web通用测试点总结
  • d3生成的树状图
  • Tushare模块
  • 详解Oracle partition分区表
  • centos配置NTP服务器
  • 跟我一起学机器学习:机器学习常用流程-1
  • [Leetcode] 寻找数组的中心索引
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Go 语言编译器的 //go: 详解
  • HTTP请求重发
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • rabbitmq延迟消息示例
  • Rancher如何对接Ceph-RBD块存储
  • Vue组件定义
  • 大数据与云计算学习:数据分析(二)
  • 高度不固定时垂直居中
  • 前端面试总结(at, md)
  • 新书推荐|Windows黑客编程技术详解
  • 学习笔记TF060:图像语音结合,看图说话
  • 再谈express与koa的对比
  • ​MySQL主从复制一致性检测
  • ​如何防止网络攻击?
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #控制台大学课堂点名问题_课堂随机点名
  • (九)信息融合方式简介
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)Oracle存储过程编写经验和优化措施
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET实现之(自动更新)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /etc/fstab 只读无法修改的解决办法
  • [AAuto]给百宝箱增加娱乐功能
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C\C++]读入优化【技巧】
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]
  • [Node + Docker] 聊聊怎么把 nodeclub 构建成 Docker 镜像
  • [NOI 2016]循环之美
  • [root]既然sudo 可以暂时获取root权限,那么为何还需要root这个用户呢
  • [Spring Cloud 项目] Spring cloud 实现房源查询功能