博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DRF开发RESTful API接口
阅读量:3943 次
发布时间:2019-05-24

本文共 3302 字,大约阅读时间需要 11 分钟。

上一篇:

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_savefrom django.dispatch import receiverfrom django.conf import settingsfrom 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 adminfrom django.urls import path, includefrom rest_framework.authtoken import viewsurlpatterns = [    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_classesfrom rest_framework.permissions import IsAuthenticated

image.png

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

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

image.png

10.3 自定义权限

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

from rest_framework import permissionsclass 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’

参考博客:

命令: pip install coreapi

如果没有配置虚拟环境可以看这篇博客:

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

settings.py

image.png

11.2 在总的路由中进行配置

urls.py

image.png

11.3 运行访问API接口

image.png


总结:

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

这个并没有明确的答案

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

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

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

转载地址:http://pkiwi.baihongyu.com/

你可能感兴趣的文章
给网站选择一个好的jquery库远程调…
查看>>
flash as 与js通信(转)
查看>>
Linux系统手动安装rzsz 软件包
查看>>
PHP的事务处理机制
查看>>
JS moveStart和moveEnd方法
查看>>
thrift的lua实现
查看>>
编写高性能的Lua代码
查看>>
Python正则表达式指南
查看>>
LUA--thrift--lib库的创建生成
查看>>
Shell开启扩展模式匹配shopt -s extglob
查看>>
浅谈 URI 及其转义
查看>>
nginx 优化
查看>>
openresty+lua在反向代理服务中的玩法
查看>>
ClickHouse集群搭建从0到1
查看>>
nginx实现请求的负载均衡 + keepalived实现nginx的高可用
查看>>
linux shell 中数组的定义和for循环遍历的方法
查看>>
求1!+2!+3!....+20!(java代码)
查看>>
VMware安装Ubuntu系统无法选择语言
查看>>
QT5.12安装
查看>>
Git/Github初步使用记录
查看>>