Django高级进阶[DRF](4. 拓展
2018-11-13 本文已影响0人
錦魚
认证和权限
- 目前,我们的API对谁可以编辑或删除代码段没有任何限制。我们希望有更高级的行为,以确保:
- 代码片段始终与创建者相关联。
- 只有通过身份验证的用户可以创建片段。
- 只有代码片段的创建者可以更新或删除它。
- 未经身份验证的请求应具有完全只读访问权限。
在模型中增加一个字段
-
我们要做一个只有本人才能修改的权限
... # 操作者 operator = models.ForeignKey('auth.User')
生成迁移文件和执行迁移
- 解决报错 这里报错的原因是,它说之前我们已经创建了很多条数据,现在你又给表增加了字段,原来的数据库里面没有这个字段,你又设置默认值,要么你输入1提供默认值,要输入2退出
去序列化里面把字段给添加上
'operator'
刷新浏览器
重写operator 拿出用户名字段
# 读取用户名
operator = serializers.ReadOnlyField(source='operator.username')
通过认证的用户才能修改
- 导入模块
from rest_framework import permissions
- 在视图里面添加一个权限(空权限)
permission_classes = ()
- 退出登录,刷新浏览器
创建自己的权限
- 创建一个模块
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
""" 自定义权限只允许对象的所有者编辑它 """
def has_object_permission(self, request, view, obj):
# 读取权限允许任何请求
# 所以我们总是允许GET HEAD POTIONS请求
if request.method in permissions.SAFE_METHODS:
return True
# 只有该出版社的录入者才有权限写
return obj.operator == request.user
- 创建一个新账号
- 切换账号
- 导入自己的写的权限
from app01.permissions import IsOwnerOrReadOnly
超链接API
-
目前我们的API中的关系是用主键表示的。我们将通过使用超链接来提高我们API的内部联系。
-
新建一张表(模型类)
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name='书名')
publisher = models.ForeignKey('Publisher')
def __str__(self):
return self.title
class Meta:
verbose_name = '书'
verbose_name_plural = verbose_name
-
生成迁移文件和执行迁移
-
创建书的序列化
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = (
'id',
'title',
'publisher'
)
-
编写Book相关视图
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = serializers.BookSerializer
permission_classes = (permissions.IsAuthenticated,)
class BookDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = serializers.BookSerializer
permission_classes = (permissions.IsAuthenticated)
增加新的路由
url(r'^books/$',views.BookList.as_view()),
url(r'^books/(?P<pk>[0-9]+)/$',views.BookDetail.as_view())
- 没数据
- 增加几条数据
通过外键重写显示字段转化为字符串(StringRelatedField)
publisher = serializers.StringRelatedField(source='publisher.name')
- 设置超链接
- 解决报错
浏览API
导入模块
from rest_framework.reverse import reverse
-
编写视图函数
@api_view(['GET'])
def api_root(request, format=None):
return Response({
'publishers': reverse('publisher-list', request=request, format=format),
'books': reverse('books_list', request=request, format=format)
})
-
在app下面单独创建一个urls
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
url(r'^publishers/$', views.PublisherList.as_view(), name='publisher-list'),
url(r'^publishers/(?P<pk>[0-9]+)/$', views.PublisherDetail.as_view(), name='publisher-detail'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest-framework')),
url(r'^books/$', views.BookList.as_view(), name='books_list'),
url(r'^books/(?P<pk>[0-9]+)/$', views.BookDetail.as_view(), name='books-detail')
]
刷新浏览器,展示所有api
分页
设置分页样式(setting.py)
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',