DRF开发RESTful API接口

上一篇:https://blog.csdn.net/qq_43401941/article/details/108962767

DRF的认证和权限

九、认证方式的介绍

  • 用户名和密码认证(BasicAuthentication)【用于测试工作,尽量不要用于生产环境】
  • Session认证(SessionAuthentication)
  • Token认证(TokenAuthentication)

认证与权限的区别:

  • 认证指的是对用户登录的身份进行校验
  • 权限指的是一个验证通过的用户,能够访问哪些接口,或者是对某个接口能够拿到什么级别权限的数据
9.1 Django信号机制自动生成Token

image.png

这是之前生成的数据表,可以查看一下authtoken_token里面包含哪些字段

image.png

9.2 生成Token
  • 1)使用Django manage.py 生成 Token

    命令python manage.py drf_create_token admin,这种方式不方便,因为不可能每次都要手动生成

  • 2)通过Django的信息号机制生成Token

    views.py

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    from django.conf import settings
    from rest_framework.authtoken.models import Token
    
    

    I_SJ_WD7K_L3IZVSB_R_N.png

原理:当User模型类新增一个实例并保存的时候,也就是新建一个用户的时候,它因为保存要调用save方法。post_save信号指的是在保存之后把信号传递给receive,receive接收到之后就会去执行generate_token函数,执行函数时,instance是指新建用户的实例,created=True,然后用传进来的用户实例去新建一个token,会在authtoken_toekn表中生成一条记录。

9.3 获取Token

在总的路由[drf_tutorial/urls.py]中添加token接口

from django.contrib import admin
from django.urls import path, include
from rest_framework.authtoken import views

urlpatterns = [
    path('admin/', admin.site.urls),
    # DRF的登录退出
    path('api-auth/', include('rest_framework.urls')),
    path('course/', include('course.urls')),
    # 获取 Token的接口
    path('api-token-auth/', views.obtain_auth_token)
]
9.4 测试
  • 1)去Admin管理后台新建一个用户

    image.png

    image.png

  • 2)查询数据库是否为刚才创建的用户生成Token

    image.png

  • 3)使用Postman工具获取Token值

    image.png

  • 4)使用Token认证的方式获取课程信息

    image.png

    如果说认证失败

    image.png


十、DRF的权限控制

DRF的权限都在permissions模块中

10.1 给函数添加权限
from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAuthenticated

image.png

把所要用的权限放在一个元组里面。这里跟全局配置是一样,这样写是多余的。

10.2 对于类视图套路还是一样

image.png

10.3 自定义权限

1. 在course下新建permissions.py文件并编写代码

from rest_framework import permissions


class IsOwnerReadOnly(permissions.BasePermission):
    """ 自定义权限:表示只有这个对象的所有者可以增删改查,非所有者只能查看 """

    def has_object_permission(self, request, view, obj):
        """
        所有的requset请求都有读权限,因此一律允许GET/HEAD/OPTIONS方法
        :param request:
        :param view:
        :param obj:
        :return:
        """
        # if request.method in ("GET", "HEAD", "OPTIONS"):
        # SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS')
        if request.method in permissions.SAFE_METHODS:
            return True

        # if request.user == obj.teacher:
        #     # 与当前用户相等
        #     return True
        # else:
        #     # 不相等
        #     return False
        # 对象的所有者才有写权限
        return obj.teacher == request.user

2. 在views.py中导入我们编写的自定义权限类

from .permissions import IsOwnerReadOnly

在通用类视图中加上我们自定义的权限

image.png

3. 使用Postman工具测试

使用user01用户去修改admin用户的课程信息

image.png

image.png

使用admin用户修改自己的课程信息

image.png

image.png


对于视图集也是如此
""" 四、DRF的视图集viewsets """


class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer
    permission_classes = (IsAuthenticated, IsOwnerReadOnly)

    def perform_create(self, serializer):
        serializer.save(teacher=self.request.user)

十一、如何生成API接口文档

在配置之前,我们还需要安装 coreapi模块 ,否则运行会报错

​ AttributeError: ‘NoneType’ object has no attribute ‘Field’

参考博客:https://blog.csdn.net/weixin_47454485/article/details/107494963

命令: pip install coreapi

如果没有配置虚拟环境可以看这篇博客:https://blog.csdn.net/qq_43401941/article/details/108923258

11.1 在settings.py文件中进行配置

settings.py

image.png

11.2 在总的路由中进行配置

urls.py

image.png

11.3 运行访问API接口

image.png


总结:

在开发时应该使用哪种视图?

这个并没有明确的答案

  • 使用函数视图编写灵活,一个接口对应一个函数,但因为不是面向对象的方式,这种面向过程的方式代码重复率比较高,自己去实现的东西非常多
  • 使用类视图可以用到python里面类的特性,封装、继承、多态,这样可以减少代码的重复率
  • 通用类视图的灵活度相对较低,只有它自己带的增删改查
  • 视图集是高度定制化的东西,代码灵活性非常低,但是开发效率非常高,四五行代码就可以把所有CRUD的业务逻辑都写好

究竟需要使用哪种,可以根据自己的使用需求和自己的编码习惯来,一般来说都是以类视图编程为主。

在一些比较简单的项目模块,只有简单的CRUD,没有复杂的逻辑,使用视图集更好;对要求非常灵活,代码又要简单的一种,处理逻辑又比较繁琐的话,可以使用函数视图。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值