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 三种方式

  

原文地址:https://www.cnblogs.com/golangav/p/7660183.html