100天 cmdb最后一天 #RESTful API - 定义规范 如get就是请求题 - 面向资源编程 把网络任何东西都当作资源 #给一个url,根据方法的不同对资源做不同的操作 #返回结果和状态码 http://www.baidu.com/order/ method: - GET - POST - PUT - DELETE #Django REST framework 为什么使用REST framework 1.前后端分离的业务需要搭建API 2.基于DJango快速开发REST api
1. pip3 install djangorestframework 2. 创建app01 3. setting 中加入 INSTALLED_APPS = [ 'rest_framework' ] REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAdminUser', ], 'PAGE_SIZE': 10 } 4. app01/models.py class Publisher(models.Model): name = models.CharField(max_length=32,verbose_name="名称",unique=True) address = models.CharField(max_length=128,verbose_name="地址") def __str__(self): return self.name class Meta: verbose_name = "出版社" verbose_name_plural = verbose_name 5. makemigrations migrate 6. 创建超级用户 admin注册Publisher 增加数据 7. 项目/urls.py urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publishers/', views.publisher_list), ] 8. app01/views.py from django.shortcuts import render from django.http import HttpResponse # Create your views here. from app01 import models def publisher_list(request): queryset = models.Publisher.objects.all() ##方式一: 列表里套字典 # data = [] # for i in queryset: # p_tmp = { # "name":i.name, # "address":i.address # } # data.append(p_tmp) ##方式二: #缺点 图片的字段无法转换为字典 data = [] from django.forms.models import model_to_dict # model 对象 转换成 字典 方式 for i in queryset: data.append(model_to_dict(i)) #方式三:djangorestframework 自提供 #需要在app01下创建serializers.py文件 from app01 import serializers serializer = serializers.PublisherSerializer(queryset,many=True) import json return HttpResponse(json.dumps(data),content_type="application/json") 9. app01/serializers.py from rest_framework import serializers from app01 import models class PublisherSerializer(serializers.ModelSerializer): class Meta: model = models.Publisher fields = ( "id", "name", "address" ) 9. 浏览器访问 序列化
#urls.py urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publishers/$', views.publisher_list), url(r'^publishers/(?P<pk>[0-9]+)$', views.publisher_detail), ] #views.py from django.shortcuts import render from django.http import HttpResponse from rest_framework.decorators import api_view from app01 import models from app01 import serializers from rest_framework.response import Response from rest_framework import status @api_view(['GET', 'POST']) def publisher_list(request,format=None): if request.method == 'GET': queryset = models.Publisher.objects.all() s = serializers.PublisherSerializer(queryset,many=True) return Response(s.data) if request.method == "POST": #创建出版社 s = serializers.PublisherSerializer(data=request.data) if s.is_valid(): s.save() return Response(s.data,status=status.HTTP_201_CREATED) else: return Response(s.errors,status=status.HTTP_400_BAD_REQUEST) @api_view(['GET', 'PUT',"DELETE"]) def publisher_detail(request,pk,format=None): try: publisher = models.Publisher.objects.get(pk=pk) except models.Publisher.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET': s = serializers.PublisherSerializer(publisher) return Response(s.data) elif request.method == 'PUT': s = serializers.PublisherSerializer(publisher, data=request.data) if s.is_valid(): s.save() return Response(s.data) return Response(s.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE': publisher.delete() return Response(status=status.HTTP_204_NO_CONTENT) #创建超级用户 pip3 install httpie http -a admin:admin111.. http://127.0.0.1:8000/publishers/ http -a admin:admin111.. http://127.0.0.1:8000/publishers/1 http -a admin:admin111.. http://127.0.0.1:8000/publishers/2
#urls.py urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publishers/$', views.PublisherList.as_view()), url(r'^publishers/(?P<pk>[0-9]+)$', views.PublisherDetail.as_view()), ] #views.py # -*- coding: utf-8 -*- from django.http import Http404 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from app01 import models from app01 import serializers from rest_framework import mixins from rest_framework import generics # Create your views here. # class PublisherList(APIView): # """ # 列出所有的出版社,或者创建一个新的出版社 # """ # # def get(self, request, format=None): # queryset = models.Publisher.objects.all() # 查询出所有的出版社 # # s = serializers.PublisherSerializer(queryset, many=True) # return Response(s.data) # # def post(self, request, format=None): # s = serializers.PublisherSerializer(data=request.data) # if s.is_valid(): # 如果数据没问题 # s.save() # return Response(s.data, status=status.HTTP_201_CREATED) # return Response(s.errors, status=status.HTTP_400_BAD_REQUEST) # class PublisherList(mixins.ListModelMixin, # mixins.CreateModelMixin, # generics.GenericAPIView): # # queryset = models.Publisher.objects.all() # serializer_class = serializers.PublisherSerializer # # 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 PublisherList(generics.ListCreateAPIView): queryset = models.Publisher.objects.all() serializer_class = serializers.PublisherSerializer # # class PublisherDetail(APIView): # """ # 具体的出版社,查看,修改,删除视图 # """ # def get_object(self, pk): # try: # return models.Publisher.objects.get(pk=pk) # except models.Publisher.DoesNotExist: # raise Http404 # # # 查看具体的出版社信息 # def get(self, request, pk, format=None): # publisher = self.get_object(pk) # s = serializers.PublisherSerializer(publisher) # return Response(s.data) # # # 修改出版社信息 # def put(self, request, pk, format=None): # publisher = self.get_object(pk) # s = serializers.PublisherSerializer(publisher, data=request.data) # if s.is_valid(): # s.save() # return Response(s.data) # return Response(s.errors, status=status.HTTP_400_BAD_REQUEST) # # # 删除出版社信息 # def delete(self, request, pk, format=None): # publisher = self.get_object(pk) # publisher.delete() # return Response(status=status.HTTP_204_NO_CONTENT) # class PublisherDetail(mixins.RetrieveModelMixin, # mixins.UpdateModelMixin, # mixins.DestroyModelMixin, # generics.GenericAPIView): # # queryset = models.Publisher.objects.all() # serializer_class = serializers.PublisherSerializer # # 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) class PublisherDetail(generics.RetrieveUpdateDestroyAPIView): queryset = models.Publisher.objects.all() serializer_class = serializers.PublisherSerializer