Django REST framework的各类技巧——1.基础讲解

写在最上面的话

django是一个神奇的框架,而restframework又是遵循了这个框架的另外一个神奇的框架,然而因为restframework的文档稀烂无比,不少时候你必须看源码才能写出科学的代码,这挡住了不少新手的路。python

要用好restframework你必须对django或者说python的几个概念有比较深入的理解,GenericView,Mixin,子类父类集成调用,多继承时的调用顺序等等,这是用好restframework的第一步。django

Django REST framework的各类技巧【目录索引】json

先说说rest

REST是一种标准,restful是一种规范,根据产品需求须要定出一份方便先后端的规范,所以不是全部的标准要求都须要遵循。segmentfault

rest的一些资料

阮一峰的博客
百度百科后端

如何用restframework实现一个(一组)api

文档先丢上api

其实就是写几个东西,就能够快速的实现api缓存

  1. 继承某个GenericView,重写里面的某个方法,最大的是get、post、put、patch、delete这些方法,然而并不推荐(应该重写mixin里面的方法)restful

  2. 实现一个serilizer,json化response框架

  3. 写一个urlpost

做为写框架的人,你须要考虑的事情还有那些?

每一个项目总有第一我的作基础构架,这个时候就不是仅仅实现一个api就ok了,你须要考虑跟多的事情,包括

  • 统一的异常处理

  • api权限

  • 统一的参数校验

  • 缓存如何能够作的更简单统一

  • 认证

  • 统一的查询过滤

  • 代码分层

基本api的demo,具体细节以后的博客会详细讲解

继承某个Genricview,重写对应方法

class CoursesView(ListCreateAPIView):

    filter_backends = (SchoolPermissionFilterBackend, filters.DjangoFilterBackend, filters.SearchFilter)
    permission_classes = (IsAuthenticated, ModulePermission)
    queryset = Course.objects.filter(is_active=True).order_by('-id')
    filter_fields = ('term',)
    search_fields = ('name', 'teacher', 'school__name')
    module_perms = ['course.course']

    def get_serializer_class(self):
        if self.request.method in SAFE_METHODS:
            return CourseFullMessageSerializer
        else:
            return CourseSerializer

    def get_queryset(self):
        return Course.objects.select_related('school', ).filter(
                is_active=True, school__is_active=True, term__is_active=True).order_by('-id')
              
    @POST('school', validators='required')
    def create(self, request, school, *args, **kwargs):
        if not SchoolPermissionFilterBackend().has_school_permission(request.user, school):
            raise Error(errors.PermissionDenied, err_message=u'没有对应学校的权限', message=u'没有对应学校的权限')
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(CourseFullMessageSerializer(serializer.instance).data, status=status.HTTP_201_CREATED, headers=headers)

实现一个serilizer,json化response

class CourseSerializer(serializers.ModelSerializer):

    class Meta:
        model = Course
        read_only_fields = ('is_active',)


class CourseFullMessageSerializer(CourseSerializer):

    school = SchoolLittleMessageSerializer()
    term = serializers.CharField(source='term.name', read_only=True)

写一个url

url(r'^courses/$', CoursesView.as_view(), name='course-list'),

按照这个流程你能够迅速实现大量的api,这是最基本的用法。

相关文章
相关标签/搜索