目前,我们的API对谁可以编辑或删除代码段没有任何限制。我们希望有更高级的行为,以确保:
- 代码片段始终与创建者相关联。
- 只有通过身份验证的用户可以创建片段。
- 只有代码片段的创建者可以更新或删除它。
- 未经身份验证的请求应具有完全只读访问权限。
开始:
前期的准备工作就不一一介绍了,详情可参考:https://blog.youkuaiyun.com/qq_41590764/article/details/108824142
开始之前,确保我们已经有一个可以正常访问的api接口了!!!
第一步:配置settings.py
我们在settings中加入rest framework的相关配置
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
# 配置此项为,只有登录认证的管理员才可以访问数据
'rest_framework.permissions.IsAdminUser',
# 配置此项为,任何人都可访问数据,但只有管理员才可增加修改数据
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
第二步:增加model模型
模型迁移:
python manage.py makemigrations
python manage.py migrate
第三步:修改urls.py增加登录接口
创建新用户:
python manage.py createsuperuser
用户名:admin
密码:admin123
登录后,就可以正常访问api接口了
第四步:修改序列化器
为让用户名更加直观,给序列化器增加以下内容
修改前:
修改后:
第五步:增加permissions.py
为了实现未经身份验证的请求只有只读权限,认证的身份具有可读可写权限
新建:permissions.py
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
自定义权限只允许对象的所有者编辑它。
"""
def has_object_permission(self, request, view, obj):
# 读取权限允许任何请求,
# 所以我们总是允许GET,HEAD或OPTIONS请求。
if request.method in permissions.SAFE_METHODS:
return True
# 只有该数据的所有者才允许写权限。
return obj.permission == request.user
第六步:修改views视图
这样就可以实现上述权限了,但发现post增加数据时,新增的表数据还存在问题
所以还要增加一个.save()
方法
第七步:启动项目
访问IP:http://127.0.0.1:8000/api/
就可以访问所有数据,并看到数据的所属关系,并且利用post增加数据,会自动在permission中增加当前登录的用户
访问IP:http://127.0.0.1:8000/api/1/
如果数据是自己创建的就可以看到自己的数据,并可以修改数据,如果不是,就只有可读权限!!!