RESTful API 和 Django REST framework

 

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    
Requests and Responses 
#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  
class view 三種方式
相關文章
相關標籤/搜索