写在最上面的话
django是一个神奇的框架,而restframework又是遵循了这个框架的另一个神奇的框架,然而由于restframework的文档稀烂无比,很多时候你必须看源码才能写出科学的代码,这挡住了很多新手的路。
要用好restframework你必须对django或者说python的几个概念有比较深刻的理解,GenericView,Mixin,子类父类集成调用,多继承时的调用顺序等等,这是用好restframework的第一步。
Django REST framework的各种技巧【目录索引】
先说说rest
REST是一种标准,restful是一种规范,根据产品需求需要定出一份方便前后端的规范,因此不是所有的标准要求都需要遵循。
rest的一些资料
如何用restframework实现一个(一组)api
其实就是写几个东西,就可以快速的实现api
继承某个GenericView,重写里面的某个方法,最大的是get、post、put、patch、delete这些方法,然而并不推荐(应该重写mixin里面的方法)
实现一个serilizer,json化response
写一个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,这是最基本的用法。