restframework 组件详解

一、restful介绍
restful是一种接口规范,前后端根据这种规范开发相应的接口,提高团队开发效率,尤其用于前后端分离,根据规范前后端开发模块互不影响
二、路由

from rest_framework.routers import SimpleRouter,DefaultRouter

在routers模块下 封装了很多关于路由的方法 , 最基础的BaseRouter类,提供自定制的接口
下面这个方法给提供了自动生成两条带参数的url
router = DefaultRouter() # 注册路由 继承BaseRouter类
router.register(‘user‘,UserProfileViewset,base_name=‘useruinfo‘)
router.register(‘menu‘,MenuProfileViewset,base_name=‘menuinfo‘)

生成到view的路由映射

三、view视图
帮助开发者提供了一些类,并在类中提供了多种方法供我们使用,下图是提供的主要的类以及继承关系

类介绍
1.APIView

class Nav(APIView):
"""
初始化菜单
"""
permission_classes = (permissions.IsAuthenticated, IsOwnerOrReadOnly)
authentication_classes = (JSONWebTokenAuthentication,)

def get(self,request):
    content = getMenu(request)
    if not content:
        return JsonResponse(data=content, code=200, msg="菜单初始化失败", flag=True)
    else:
        return JsonResponse(data=content, code=200, msg="菜单初始化成功", flag=True)

提供get,post,put,patch,delete五种方法
2.GenericAPIView

class IndexView(GenericAPIView):
queryset = models.UserInfo.objects.all()
serializer_class = UserInfoSerializer
lookup_field = ‘pk‘

def get(self,request,*args,**kwargs):
    pk = kwargs.get(‘pk‘)
    if pk:
        users = self.filter_queryset(queryset=models.UserInfo.objects.get(pk=pk))
        ser = self.get_serializer(instance=users)
    else:
        users = self.get_queryset()
        ser = self.get_serializer(instance=users,many=True)
    return Response(ser.data)

在GenericAPIView中要重写一些字段和方法,不常用
3.GenericViewSet

class IndexView(GenericViewSet):
serializer_class = UserInfoSerializer
queryset = models.UserInfo.objects.all()
def create(self,request,*args,**kwargs):
    pass

def list(self,request,*args,**kwargs):  # 获取列表数据
    users = models.UserInfo.objects.all()
    ser = UserInfoSerializer(instance=users,many=True)
    return Response(ser.data)

def retrieve(self,request,*args,**kwargs):  # 获取单条数据
    pk = kwargs.get(‘pk‘)
    users = models.UserInfo.objects.get(pk=pk)
    ser = UserInfoSerializer(instance=users,many=False)
    return Response(ser.data)

def destroy(self,request,*args,**kwargs):
    pass

def update(self,request,*args,**kwargs):
    pass
    def partial_update(self,request,*args,**kwargs):
            pass

这个类继承了ViewSetMixin, generics.GenericAPIView,其中在ViewSetMixin中会重写as_view()方法,因此可以将URL中的请求方式与视图函数绑定到一起,在urls.py中以键值对的方式存在

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import  views
    urlpatterns = [
        # url(r‘^admin/‘, admin.site.urls),
        url(r‘^hehe/‘, views.hehe),
        url(r‘^index/$‘, views.IndexView.as_view({‘get‘:‘list‘,‘post‘:‘create‘})),
        url(r‘^index/(?P<pk>\d+)/$‘, views.IndexView.as_view({‘get‘:‘retrieve‘,‘put‘:‘update‘,‘patch‘:‘partial_update‘,‘delete‘:‘destroy‘})),]

4.ModelViewSet
ModelViewSet继承了四个混入类和一个泛类,将会获得增删改查的所有方法

class ModelViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.UpdateModelMixin,
               mixins.DestroyModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass

四、认证
rest_framework给我们提供了认证的接口,由BaseAuthentication类提供接口,也有一些封装好的认证类
接口函数 authticate 认证成功返回一元组(user,token)分别赋值给request.user 和 request.auth

class Auth(BaseAuthentication):
def authenticate(self, request):
    token = request.query_params.get(‘token‘)
    obj = models.Token.objects.filter(token=token).first()
    if not obj:
        raise AuthenticationFailed({‘code‘: 1001, ‘error‘: ‘认证失败‘})
    return (obj.user.username, obj)

认证方式有多种,可以使用jwt认证

from rest_framework_jwt.authentication import JSONWebTokenAuthentication
class UserProfileViewset(custom_viewset_base.CustomViewBase):
"""
permission_classes,authentication_classes放置顺序不能变

"""
permission_classes = (IsOwnerOrReadOnly,)
    authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication)
serializer_class = UserProfileSerializer
queryset = User.objects.all()
pagination_class = custom_pagination.LargeResultsSetPagination
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_class = UserProfileFilter
search_fields = (‘username‘, )  # ^以什么开头匹配,=等于匹配 "__all__"
ordering_fields = (‘username‘,)  # 排序
ordering = (‘username‘,)  # 排序字段

五、权限
由BasePermission类给提供接口 接口函数为 has_permission 以及 has_object_permission

class BasePermission(object):
"""
A base class from which all permission classes should inherit.
"""

def has_permission(self, request, view):
    """
    Return `True` if permission is granted, `False` otherwise.
    """
    # 这里写我们的权限逻辑
    return True

def has_object_permission(self, request, view, obj):
    """
    Return `True` if permission is granted, `False` otherwise.
    """
    return True

可以重写该方法,来控制访问权限

六、序列化
对queryset序列化以及对请求数据格式验证。
通常继承两个类 Serializer 以及 ModelSerializer
Serializer 序列化的每个字段都要自己写 ModelSerializer 会根据数据库表渲染所有字段

class CourseDetailModelSerializers(serializers.ModelSerializer):
title = serializers.CharField(source=‘course.name‘)
img = serializers.ImageField(source=‘course.course_img‘)
level = serializers.CharField(source=‘course.get_level_display‘)
recommends = serializers.SerializerMethodField()
chapters = serializers.SerializerMethodField()

def get_recommends(self, obj):
    queryset = obj.recommend_courses.all()
    return [{‘id‘: row.id, ‘title‘: row.name} for row in queryset]

def get_chapters(self, obj):
    queryset = obj.course.course_chapters.all()
    return [{‘id‘: row.id, ‘name‘: row.name} for row in queryset]

class Meta:
    model = CourseDetail
    fields = [‘course‘, ‘title‘, ‘img‘, ‘level‘, ‘why_study‘, ‘chapters‘, ‘recommends‘]

七、分页
自定义分页
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
from collections import OrderedDict
from rest_framework.response import Response

class LargeResultsSetPagination(PageNumberPagination):
page_size = 10 # 每页默认显示条数
page_size_query_param = "page_size" # 每页显示条数传参字符串
page_query_param = "page" # 显示第几页数据传参
max_page_size = 100 # 最大页码

def get_paginated_response(self, data):
    code = 200
    msg = ‘查询成功‘
    if not data:
        code = 200
        msg = "数据为空"

    return Response(OrderedDict([
        (‘code‘, code),
        (‘msg‘, msg),
        (‘flag‘, True),
        (‘count‘, self.page.paginator.count),
        (‘next‘, self.get_next_link()),
        (‘previous‘, self.get_previous_link()),
        (‘results‘, data)
    ]))

在view中引入
pagination_class = LargeResultsSetPagination

八、过滤器
使用django_filters模块

import django_filters

from user.models import *

class UserProfileFilter(django_filters.rest_framework.FilterSet):
"""
过滤用户
"""
#id = django_filters.NumberFilter(field_name="id",lookup_expr="exact") # 精确匹配
username = django_filters.CharFilter(field_name="username",lookup_expr="contains")
#name = django_filters.CharFilter(field_name="name", lookup_expr="contains")
#mobile = django_filters.CharFilter(field_name="mobile", lookup_expr="contains")

class Meta:
    model = UserProfile
    fields = ["username"]

view视图应用
filter_class = UserProfileFilter

九、渲染器
默认的两个渲染器,一个是Json的,一个是用浏览器访问rest_framework自带的模板的

原文地址:https://blog.51cto.com/haoyonghui/2459489

时间: 2024-08-30 17:34:39

restframework 组件详解的相关文章

Android 四大组件 详解

[置顶] Android四大组件详解 分类: Android四大组件2013-02-09 16:23 19411人阅读 评论(13) 收藏 举报 Android开发 注:本文主要来自网易的一个博主的文章,经过阅读,总结,故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个

Android中Intent组件详解

Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作.与动作有关的数据等.Android则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将 Intent对象传递给所找到的组件,Android的媒婆任务就完成了. 在Google Doc中是这样描述Intent的(摘自Android中文翻译组)当接收到ContentR

基于jQuery的TreeGrid组件详解

一.TreeGrid组件相关的类 1.TreeGrid(_config) _config:json格式的数据,组件所需要的数据都通过该参数提供. 2.TreeGridItem(_root, _rowId, _rowIndex, _rowData) _root:显示组件实例的目标容器对象. _rowId:选中行的id. _rowIndex:选中行的索引. _rowData:json格式的行数据. 二._config参数详解 id:组件实例的id. width:组件实例的宽度. renderTo:用

vue.js基础知识篇(6):组件详解

第11章:组件详解 组件是Vue.js最推崇也最强大的功能之一,核心目标是可重用性. 我们把组件代码按照template.style.script的拆分方式,放置到对应的.vue文件中. 1.注册 Vue.js的组件注册分为全局注册和局部注册. 全局注册使用Vue.component方法.第一个参数是组件名字,第二个参数是组件的构造函数,要么是function,要么是object. <!DOCTYPE html> <html lang="en"> <hea

Android组件系列----Activity组件详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3924567.html 联系方式:[email protected] [正文] 注:四大组件指的是应用组件:Activity.Service.BroadcastReceiver.ContentProvider:之前的控件指的是UI组件. 博文目录: 一.Activity简介 二.Activity的状

Tomcat系列之服务器的安装与配置以及各组件详解

Tomcat系列之服务器的安装与配置以及各组件详解 大纲 一.前言 二.安装与配置Tomcat 三.Tomcat 目录的结构 四.Tomcat 配置文件 注,本文的测试的操作系统为CentOS 6.4 x86_64,软件版本为jdk-7u40.apache-tomcat-7.0.42.博文中的所有软件请到这里下载:http://yunpan.cn/QGBCLwrZnpLMS. 一.前言 在上一篇博文中我们主要讲解的Tomcat的基础知识以及相关的Java知识,对于不怎么清楚的博友可以参考一下:h

【React Native开发】React Native控件之Touchable*系列组件详解(18)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50630984 本文出自:[江清清的博客] (一)前言 [好消息]个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org 今天我们一起来看一下Touchable*系列组件的使用详解,该系列组件包括四种分别为:TouchableHighlight,TouchableNativeFeedback,Touch

(转载)log4net 组件详解

1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual Studio2008中使用log4net快速创建系统日志,如何扩展以输出自定义字段. 2.一个简单的使用实例 第一步:在项目中添加对log4net.dll的引用,这里引用版本是1.2.10.0. 第二步:程序启动时读取log4net的配置文件. 如果是CS程序,在根目录的Program.cs中的Mai

迈向angularjs2系列(3):组件详解

一: 以组件开发一个to-do list应用 todo组件分为导入.接口定义.顶层组件.控制器.启动5个部分. app.ts: //导入 import {Component} from '@angular/core'; import {bootstrap} from '@angular/platform-browser-dynamic'; //接口定义 interface Todo { completed: boolean; label: string; } //顶层组件 @Component(