Django REST framework使用案例
来源:互联网 发布:淘宝关键词挖掘小助手 编辑:程序博客网 时间:2024/06/05 18:15
Django REST framework使用案例
引用官方的话说:Django REST framework is a powerful and flexible toolkit for building Web APIs.
如果你不太理解restful架构,请参见理解RESTful架构一文
下面以一个简单的学生管理系统示例,简述一下Django REST framework的使用
环境
mac
python2.7.12
django1.10.3
djangorestframework3.5.3
1.示例简述
model分为班级(Classes)、课程(Course)、学生(Student)、成绩(Score)
2.项目初始化
安装djangorestframework3.5.3
pip install djangorestframework
创建项目及app略
配置settings.py
...INSTALLED_APPS = [ ... 'rest_framework', # 必配项 'stuapp',]# 打开分页,设置API只能管理员用户访问(可自行选择配置)REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAdminUser', ], 'PAGE_SIZE': 10}...
3.创建model
#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.db import modelsSEX_CHOICES = ((1,u'男'), (2,u'女'))class Classes(models.Model): """班级""" name = models.CharField(max_length=32) def __unicode__(self): return self.nameclass Student(models.Model): """学生""" name = models.CharField(max_length=16, null=False, verbose_name=u'学生姓名') sex = models.CharField(max_length=16, choices=SEX_CHOICES, default=1) classes = models.ForeignKey(Classes) def __unicode__(self): return self.nameclass Course(models.Model): """课程""" name = models.CharField(max_length=32) def __unicode__(self): return self.nameclass Score(models.Model): """成绩""" score = models.DecimalField(max_digits=5, decimal_places=2) student = models.ForeignKey(Student) course = models.OneToOneField(Course) def __unicode__(self): return self.name
4.创建序列化类
创建序列化类时,可能会用到指定类型的字段或关系。各字段类型、关系详细说明,请参见字段类型,关系
#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom stuapp.models import *from rest_framework import serializersclass ClassesSerializer(serializers.ModelSerializer): class Meta: model = Classes fields = ('id', 'name')class StudentSerializer(serializers.ModelSerializer): classes = ClassesSerializer(read_only=True) class Meta: model = Student fields = ('id', 'name', 'sex', 'classes')class CourseSerializer(serializers.ModelSerializer): class Meta: model = Course fields = ('id', 'name')class ScoreSerializer(serializers.ModelSerializer): student = StudentSerializer(many=False, read_only=True) course = CourseSerializer(many=False, read_only=True) class Meta: model = Score fields = ('id', 'score', 'student', 'course')
REST framework提供了2中装饰器来编写视图,
1.基于函数视图的@api_view
2.基于类视图的APIView
5.创建课程(Course)视图(基于函数视图)
#!/usr/bin/env python# -*- coding: utf-8 -*-from rest_framework import statusfrom rest_framework.decorators import api_viewfrom rest_framework.response import Responsefrom stuapp.models import Coursefrom stuapp.serializers import CourseSerializer@api_view(['GET', 'POST'])def CouList(request): """ POST 创建课程; GET 获取课程列表 """ if request.method == 'GET': course = Course.objects.all() serializer = CourseSerializer(course, many=True) return Response(serializer.data) elif request.method == 'POST': serializer = CourseSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)@api_view(['GET', 'PUT', 'DELETE'])def CouDetail(request, pk): """ GET 获取某课程详情; PUT 更新某课程; DELETE 删除某课程 """ try: course = Course.objects.get(pk=pk) except Course.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET': serializer = CourseSerializer(course) return Response(serializer.data) elif request.method == 'PUT': serializer = CourseSerializer(course, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE': course.delete() return Response(status=status.HTTP_204_NO_CONTENT)
6.创建学生(Student)视图(基于类视图)
#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom stuapp.models import *from stuapp.serializers import StudentSerializerfrom django.http import Http404from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework import statusclass StuList(APIView): def get(self, request, format=None): stu = Student.objects.all() serializer = StudentSerializer(stu, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = StudentSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)class StuDetail(APIView): def get_object(self, pk): try: return Student.objects.get(pk) except Student.DoesNotExist: raise Http404 def get(self, request, pk, format=None): stu = self.get_object(pk) serializer = StudentSerializer(stu) return Response(serializer.data) def put(self, request, pk, format=None): stu = self.get_object(pk) serializer = StudentSerializer(stu, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None): stu = self.get_object(pk) stu.delete() return Response(status=status.HTTP_204_NO_CONTENT)
7.创建班级(Classes)视图(使用Mixins)
使用基于类的视图的最大优点之一是我们可以方便的重用代码。目前我们使用了很多相似的代码来进行了创建/检索/更新/删除操作,这些常见操作被封装在Mixins类中。
#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom stuapp.models import *from stuapp.serializers import ClassesSerializerfrom rest_framework import mixinsfrom rest_framework import genericsclass ClaList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Classes.objects.all() serializer_class = ClassesSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)class ClaDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Classes.objects.all() serializer_class = ClassesSerializer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
8.创建成绩视图(Score)(使用通用类视图)
使用Mixins编写视图比之前简单了许多,我们仍可以简写代码,此框架为我们提供了通用类视图
#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom stuapp.models import Scorefrom stuapp.serializers import ScoreSerializerfrom rest_framework import genericsclass ScoList(generics.ListCreateAPIView): queryset = Score.objects.all() serializer_class = ScoreSerializerclass ScoDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Score.objects.all() serializer_class = ScoreSerializer
9.url配置
from django.conf.urls import urlfrom django.contrib import adminfrom stuapp import stuviewsfrom stuapp import claviewsfrom stuapp import couviewsfrom stuapp import scoviewsfrom rest_framework.urlpatterns import format_suffix_patternsurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^stu/$', stuviews.StuList.as_view()), url(r'^stu/(?P<pk>[0-9]+)/$', stuviews.StuDetail.as_view()),]urlpatterns += [ url(r'^cla/$', claviews.ClaList.as_view()), url(r'^cla/(?P<pk>[0-9]+)/$', claviews.ClaDetail.as_view()),]# 注意,基于函数的装饰器编写的视图,没有as_view()urlpatterns += [ url(r'^cou/$', couviews.CouList), url(r'^cou/(?P<pk>[0-9]+)/$', couviews.CouDetail),]urlpatterns += [ url(r'^sco/$', scoviews.ScoList.as_view()), url(r'^sco/(?P<pk>[0-9]+)/$', scoviews.ScoDetail.as_view()),]urlpatterns = format_suffix_patterns(urlpatterns)
代码下载:https://github.com/apple9005/django-rest-framework
1 0
- Django REST framework使用案例
- django rest framework使用django-filter
- Django rest framework 使用自定义认证方式
- Django REST Framework(一) 初步使用
- django-rest-framework过滤器的使用(三)
- Django REST framework
- Django REST framework API
- Django REST framework
- Django-Rest-Framework 教程
- django rest framework Serializer
- Django Rest Framework
- django rest framework quickstart
- Django rest framework
- Django rest framework --- Routers
- Django rest framework ---Serializers
- Django-Rest-Framework 入门
- Django Rest Framework - 初识
- django-REST framework
- JAVA-SFTP上传文件
- DOM创建XML文件
- Java并发编程:Callable、Future和FutureTask
- Linux服务器 快捷登录设置
- 这是我的第一个博客
- Django REST framework使用案例
- 5-11 时间换算 (10分)
- Kosaraju算法求解强连通分量
- esri-leaflet入门教程(5)- 动态绘制图形
- 一个好用的国产电脑文件同步软件
- Java与c++通过JNI的完美结合
- CSS学习记录2
- 通过JDK6带的WSIMPORT命令 基于WSDL生成对应的CLIENT代码,以及所引入的XSD定义的类
- mysql基础简介