Django REST framework的各類技巧——1.基礎講解

寫在最上面的話

django是一個神奇的框架,而restframework又是遵循了這個框架的另外一個神奇的框架,然而因爲restframework的文檔稀爛無比,不少時候你必須看源碼才能寫出科學的代碼,這擋住了不少新手的路。python

要用好restframework你必須對django或者說python的幾個概念有比較深入的理解,GenericView,Mixin,子類父類集成調用,多繼承時的調用順序等等,這是用好restframework的第一步。django

Django REST framework的各類技巧【目錄索引】json

先說說rest

REST是一種標準,restful是一種規範,根據產品需求須要定出一份方便先後端的規範,所以不是全部的標準要求都須要遵循。後端

rest的一些資料

阮一峯的博客 百度百科api

如何用restframework實現一個(一組)api

文檔先丟上緩存

其實就是寫幾個東西,就能夠快速的實現apirestful

  1. 繼承某個GenericView,重寫裏面的某個方法,最大的是get、post、put、patch、delete這些方法,然而並不推薦(應該重寫mixin裏面的方法)
  2. 實現一個serilizer,json化response
  3. 寫一個url

做爲寫框架的人,你須要考慮的事情還有那些?

每一個項目總有第一我的作基礎構架,這個時候就不是僅僅實現一個api就ok了,你須要考慮跟多的事情,包括框架

  • 統一的異常處理
  • api權限
  • 統一的參數校驗
  • 緩存如何能夠作的更簡單統一
  • 認證
  • 統一的查詢過濾
  • 代碼分層

基本api的demo,具體細節以後的博客會詳細講解

繼承某個Genricview,重寫對應方法post

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化responseui

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,這是最基本的用法。

相關文章
相關標籤/搜索