上一篇: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,没有复杂的逻辑,使用视图集更好;对要求非常灵活,代码又要简单的一种,处理逻辑又比较繁琐的话,可以使用函数视图。