美文网首页
Django高级进阶[DRF](4. 拓展

Django高级进阶[DRF](4. 拓展

作者: 錦魚 | 来源:发表于2018-11-13 18:34 被阅读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',
    

    分页相关

    相关文章

      网友评论

          本文标题:Django高级进阶[DRF](4. 拓展

          本文链接:https://www.haomeiwen.com/subject/wcelfqtx.html