zoukankan      html  css  js  c++  java
  • 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. 权限控制
  • 相关阅读:
    Java实现 LeetCode 69 x的平方根
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 66 加一
    Java实现 LeetCode 66 加一
    CxSkinButton按钮皮肤类
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/7294984.html
Copyright © 2011-2022 走看看