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/
访问效果:
三 原理剖析
其内部实现原理与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


浙公网安备 33010602011771号