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