Django Rest framework

Django Rest framework,是一套基于Django的 REST 框架,是一个强大灵活的构建 Web API 的工具包。

一 安装

pip3 install djangorestframework

二 示例

第一步:注册app

INSTALLED_APPS = [
    'django.contrib.admin',
    # ...,
    'rest_framework',
]

第二步:注册路由

from django.conf.urls import url,include
from api import views
from rest_framework import routers

# 创建router对象及注册url映射关系
router = routers.DefaultRouter()
router.register(r'servers', views.ServerViewSet)

urlpatterns = [
    url(r'^asset.html$', views.asset),
    url(r'^', include(router.urls)),
]

第三步:编写ViewSet视图函数

第四步:编写serializers,form验证以及数据库操作

from rest_framework import serializers
from repository import models

class ServerSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Server           # 指定操作对象
        fields = ('id','hostname')    	# 指定仅能操作及显示指定字段
        # exclude = ('sn',)
        depth = 1    # 0<=depth<=10   通过fk指定查询深度,比如:depth=1,则代表可以关联到fk

		
from rest_framework import viewsets

class ServerViewSet(viewsets.ModelViewSet):
    queryset = models.Server.objects.all().order_by('id')   # queryset是固定名称,不可更改
    serializer_class = ServerSerializer

最终访问路径如下:

[GET]       http://127.0.0.1:8012/api/servers/
[POST]      http://127.0.0.1:8012/api/servers/
[GET]       http://127.0.0.1:8012/api/servers/1/
[PUT]       http://127.0.0.1:8012/api/servers/1/
[DELETE]    http://127.0.0.1:8012/api/servers/1/

访问效果:

image

三 原理剖析

其内部实现原理与RESTful框架一致,具体代码如下:

urls.py

from django.conf.urls import url
from api import views

urlpatterns = [
    url(r'^servers/$', views.ServerView.as_view()),
    url(r'^servers/(?P<pk>\d+)/$', views.ServerDetail.as_view()),
]

views.py

import json
from repository import models
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from . import serializers
from rest_framework.parsers import JSONParser
from django.http import JsonResponse

class ServerView(APIView):
    def get(self, request, *args, **kwargs):
        """
        获取数据
        """
        data_list = models.UserProfile.objects.all()
        # from django.core import serializers
        # data = serializers.serialize("json", data_list)
        # return HttpResponse(data)

        # 序列化+form验证
        serializer = serializers.MySerializer(instance=data_list, many=True)  # many指多个对象
        return HttpResponse(json.dumps(serializer.data,ensure_ascii=False))
        # return JsonResponse(serializer.data,safe=False)

    def post(self, request, *args, **kwargs):
        """
        创建数据
        :param request: 此时的request已经被重新封装了 from rest_framework.request import Request
        """
        # print(request.data)                 # 获取数据方式一
        # # print(request._request.body)      # 获取数据方式二
        # models.UserProfile.objects.create(**request.data)

        # 利用rest_framework
        data = JSONParser().parse(request)
        serializer = serializers.MySerializer(data=data)
        if serializer.is_valid():
            # 如果有instance,则执行update方法;否则,执行create
            serializer.save()
        return HttpResponse(status=200)

class ServerDetail(APIView):
    def get(self, request, *args, **kwargs):
        """
        获取单条数据
        """
        obj = models.UserProfile.objects.filter(id=kwargs.get('pk')).first()
        serializer = serializers.MySerializer(instance=obj)
        return JsonResponse(serializer.data,status=200)

    def put(self, request, *args, **kwargs):
        """
        更新数据
        """
        obj = models.UserProfile.objects.filter(id=kwargs.get('pk')).first()
        data = JSONParser().parse(request)
        serializer = serializers.MySerializer(instance=obj,data=data)
        if serializer.is_valid():
            serializer.save()
        return HttpResponse(status=200)

    def delete(self, request, *args, **kwargs):
        """
        删除数据
        """
        obj = models.UserProfile.objects.filter(id=kwargs.get('pk'))
        obj.delete()
        return HttpResponse(status=204)

serializers.py

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from repository import models


class MySerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(required=False, allow_blank=True, max_length=100)
    email = serializers.CharField()

    def validate_name(self,value):
        """
        钩子函数
        """
        return value

    def validate_email(self,value):
        """
        钩子函数
        """
        return value

    def update(self, instance, validated_data):
        instance.name = validated_data['name']
        instance.email = validated_data['email']
        instance.save()

    def create(self, validated_data):
        models.UserProfile.objects.create(**validated_data)

更多用法:http://www.cnblogs.com/wupeiqi/articles/7805382.html



posted @ 2018-04-17 11:40  Joe1991  阅读(353)  评论(0)    收藏  举报