21

写在最上面的话

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

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

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

先说说rest

REST是一种标准,restful是一种规范,根据产品需求需要定出一份方便前后端的规范,因此不是所有的标准要求都需要遵循。

rest的一些资料

阮一峰的博客
百度百科

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

文档先丢上

其实就是写几个东西,就可以快速的实现api

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

  2. 实现一个serilizer,json化response

  3. 写一个url

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

每个项目总有第一个人做基础构架,这个时候就不是仅仅实现一个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,这是最基本的用法。


D咄咄
1.7k 声望257 粉丝

Life is to short, please use python.