DRF开发RESTful API接口

    科技2025-09-07  63

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

    DRF的认证和权限

    九、认证方式的介绍

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

    认证与权限的区别:

    认证指的是对用户登录的身份进行校验权限指的是一个验证通过的用户,能够访问哪些接口,或者是对某个接口能够拿到什么级别权限的数据

    9.1 Django信号机制自动生成Token

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

    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

    原理:当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管理后台新建一个用户

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

    3)使用Postman工具获取Token值

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

    如果说认证失败


    十、DRF的权限控制

    DRF的权限都在permissions模块中

    10.1 给函数添加权限

    from rest_framework.decorators import permission_classes from rest_framework.permissions import IsAuthenticated

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

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

    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

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

    3. 使用Postman工具测试

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

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


    对于视图集也是如此

    """ 四、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

    11.2 在总的路由中进行配置

    urls.py

    11.3 运行访问API接口


    总结:

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

    这个并没有明确的答案

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

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

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

    Processed: 0.030, SQL: 9