本文共 3302 字,大约阅读时间需要 11 分钟。
上一篇:
认证与权限的区别:
这是之前生成的数据表,可以查看一下authtoken_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
原理:当User模型类新增一个实例并保存的时候,也就是新建一个用户的时候,它因为保存要调用save方法。post_save信号指的是在保存之后把信号传递给receive,receive接收到之后就会去执行generate_token函数,执行函数时,instance是指新建用户的实例,created=True,然后用传进来的用户实例去新建一个token,会在authtoken_toekn表中生成一条记录。
在总的路由[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)]
1)去Admin管理后台新建一个用户
2)查询数据库是否为刚才创建的用户生成Token
3)使用Postman工具获取Token值
4)使用Token认证的方式获取课程信息
如果说认证失败
DRF的权限都在permissions模块中
from rest_framework.decorators import permission_classesfrom rest_framework.permissions import IsAuthenticated
把所要用的权限放在一个元组里面。这里跟全局配置是一样,这样写是多余的。
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
在通用类视图中加上我们自定义的权限
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)
在配置之前,我们还需要安装 coreapi模块 ,否则运行会报错
AttributeError: ‘NoneType’ object has no attribute ‘Field’
参考博客:
命令: pip install coreapi
如果没有配置虚拟环境可以看这篇博客:
settings.py
urls.py
这个并没有明确的答案
究竟需要使用哪种,可以根据自己的使用需求和自己的编码习惯来,一般来说都是以类视图编程为主。
在一些比较简单的项目模块,只有简单的CRUD,没有复杂的逻辑,使用视图集更好;对要求非常灵活,代码又要简单的一种,处理逻辑又比较繁琐的话,可以使用函数视图。
转载地址:http://pkiwi.baihongyu.com/