• Django REST framework


      一、什么是REST?

    • REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
    • REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态
    • REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
    • 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
    • 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

      设计参考:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

      二、目前如何实现REST API?

      按照规则,根据不同的请求方式做出不同的处理,并且返回内容以及相应状态码。

      三、什么是 Django REST framework?

       Django REST framework是一个基于Django开发的app,用于快速搭建REST API。

      1、安装:

    pip3 install djangorestframework
    

      2、快速使用:

    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
    注册APP
    from rest_framework import routers
    from . import views
    
    
    router = routers.DefaultRouter()
    router.register(r'users', views.UserInfoViewSet)
    
    urlpatterns = [
        url(r'^', include(router.urls)),
    ]
    注册路由
    from rest_framework import viewsets
    from . import models
    from . import serializers
    
    # ########### 1. 基本处理方式 ###########
    
    class UserInfoViewSet(viewsets.ModelViewSet):
        """
        API endpoint that allows users to be viewed or edited.
        """
        queryset = models.UserInfo.objects.all().order_by('-id')
        serializer_class = serializers.UserInfoSerializer
    编写ViewSet,视图函数
    from rest_framework import serializers
    from . import models
    
    class UserInfoSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = models.UserInfo
            # fields = ('id', 'username', 'pwd','ug') # fields = '__all__'
            exclude = ('ug',)
            depth = 1  # 0<=depth<=10
    编写serializers,form验证以及数据库操作

      ps:最终访问路径

    [GET]          http://127.0.0.1:8000/api/users/
    [POST]         http://127.0.0.1:8000/api/users/
    [GET]          http://127.0.0.1:8000/api/users/7/
    [PUT]          http://127.0.0.1:8000/api/users/7/
    [DELETE]       http://127.0.0.1:8000/api/users/7/
    

      3、基于CBV

    from django.conf.urls import url,include
    from django.contrib import admin
    from . import views
    
    urlpatterns = [
        url(r'^users/$', views.UserList.as_view()),
        url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
    ]
    a. URL
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.request import Request
    from rest_framework.parsers import JSONParser
    from . import models
    from . import serializers
    
    
    class UserList(APIView):
        def get(self, request, *args, **kwargs):
            user_list = models.UserInfo.objects.all()
            serializer = serializers.MySerializer(instance=user_list, many=True)
            return Response(serializer.data)
    
        def post(self, request, *args, **kwargs):
            data = JSONParser().parse(request)
            serializer = serializers.MySerializer(data=data)
            if serializer.is_valid():
                # print(serializer.data)
                # print(serializer.errors)
                # print(serializer.validated_data)
                # 如果有instance,则执行update方法;否则,执行create
                serializer.save()
                return Response(serializer.data, status=201)
            return Response(serializer.errors, status=400)
    
    
    class UserDetail(APIView):
        def get(self, request, *args, **kwargs):
            obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
            serializer = serializers.MySerializer(obj)
            return Response(serializer.data)
    
        def delete(self, request, *args, **kwargs):
            obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
            obj.delete()
            return Response(status=204)
    
        def put(self, request, *args, **kwargs):
            data = JSONParser().parse(request)
            obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
            serializer = serializers.MySerializer(obj, data=data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors, status=400)
    编写视图函数
    from rest_framework import serializers
    from rest_framework.exceptions import ValidationError
    from . import models
    
    
    class MySerializer(serializers.Serializer):
        id = serializers.IntegerField(read_only=True)
        username = serializers.CharField(required=False, allow_blank=True, max_length=100)
        pwd = serializers.CharField()
    
        def validate_username(self, value):
            if value == '中国':
                raise ValidationError('用户名中存在敏感字符')
            return value
    
        def validate_pwd(self, value):
            print(value)
            return value
    
        def validate(self, attrs):
            print(attrs)
            return attrs
    
        def create(self, validated_data):
            """
            当执行save方法时,自动调用。instance未传值
            :param validated_data:
            :return:
            """
            print(validated_data)
            return models.UserInfo.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            """
            当执行save方法时,自动调用。instance传值
            :param instance:
            :param validated_data:
            :return:
            """
            instance.username = validated_data.get('username', instance.username)
            instance.save()
            return instance
    c. 编写serializers

      4、基于FBV

    from django.conf.urls import url,include
    from django.contrib import admin
    from . import views
    
    urlpatterns = [
        url(r'^users/$', views.user_list),
        url(r'^users/(?P<pk>[0-9]+)/$', views.user_detail),
    ]
    a. URL
    from django.http import JsonResponse,HttpResponse
    from rest_framework.response import Response
    from rest_framework.parsers import JSONParser
    from rest_framework.decorators import api_view
    from .serializers import MySerializer
    from . import models
    
    @api_view(['GET',"POST"])
    def user_list(request):
        """
        List all code snippets, or create a new snippet.
        """
        if request.method == 'GET':
            user_list = models.UserInfo.objects.all()
            serializer = MySerializer(user_list,many=True)
            return Response(serializer.data)
    
        elif request.method == 'POST':
            data = JSONParser().parse(request)
            serializer = MySerializer(data=data)
            if serializer.is_valid():
                print(serializer.data)
                print(serializer.errors)
                print(serializer.validated_data)
                # 如果有instance,则执行update方法;否则,执行create
                serializer.save()
                return Response(serializer.data, status=201)
            return Response(serializer.errors, status=400)
    
    @api_view(['GET',"POST","PUT"])
    def user_detail(request, pk):
        """
        Retrieve, update or delete a code snippet.
        """
    
        obj = models.UserInfo.objects.filter(pk=pk).first()
        if not obj:
            return HttpResponse(status=404)
    
        if request.method == 'GET':
            serializer = MySerializer(obj)
            # return JsonResponse(serializer.data,json_dumps_params={'ensure_ascii':False},content_type='application/json;charset=utf-8')
            return Response(serializer.data)
    
        elif request.method == 'PUT':
            data = JSONParser().parse(request)
            serializer = MySerializer(obj, data=data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors, status=400)
    
        elif request.method == 'DELETE':
            obj.delete()
            return Response(status=204)
    b. 视图函数
    from rest_framework import serializers
    from rest_framework.exceptions import ValidationError
    from . import models
    
    
    class MySerializer(serializers.Serializer):
        id = serializers.IntegerField(read_only=True)
        username = serializers.CharField(required=False, allow_blank=True, max_length=100)
        pwd = serializers.CharField()
    
        def validate_username(self, value):
            if value == '中国':
                raise ValidationError('用户名中存在敏感字符')
            return value
    
        def validate_pwd(self, value):
            print(value)
            return value
    
        def validate(self, attrs):
            print(attrs)
            return attrs
    
        def create(self, validated_data):
            """
            当执行save方法时,自动调用。instance未传值
            :param validated_data:
            :return:
            """
            print(validated_data)
            return models.UserInfo.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            """
            当执行save方法时,自动调用。instance传值
            :param instance:
            :param validated_data:
            :return:
            """
            instance.username = validated_data.get('username', instance.username)
            instance.save()
            return instance
    c. 编写serializers

       5、权限控制

    REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': [
            'permissi.MyPermission',
        ]
    }
    a. settings配置文件
    class MyPermission(object):
        """
        A base class from which all permission classes should inherit.
        """
    
        def has_permission(self, request, view):
            """
            Return `True` if permission is granted, `False` otherwise.
            """
    
            return True
    
        def has_object_permission(self, request, view, obj):
            return True
    b. 权限控制
  • 相关阅读:
    关于TCP/IP协议栈
    关于java socket
    批处理的高吞吐率和高延迟的解释
    关于Xmanager使用问题的总结
    关于Storm Stream grouping
    django url 传递多个参数
    多线程 python threading 信号量/递归锁
    多线程 python threading 简单锁/互斥锁
    django 1.9 wsgi + nginx
    django models ForeignKey Many-to-ManyField 操作
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/7294984.html
Copyright © 2020-2023  润新知