Django REST Framework学习笔记,这里不会对Django做介绍,只是自己对Django REST Framework学习的记录。
环境说明:
-
Python3.7
-
Django2.2
DRF是什么?为何要使用DRF?
WHAT:Django REST framework是一套基于Django框架编写RESTful风格API的组件(功能强大且灵活的工具包),用于构建Web API。
WHY:Django REST Framework可以在Django的基础上迅速实现API,并且自身还带有WEB的测试页面,可以方便的测试自己的API。
Django Rest Framework特点
- 自动生成网站API文档;
- 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
- Authentication(身份认证):快速实现支持Auth1、Auth2方式的权限验证。
- 提供了丰富的类视图、Mixin扩展类:简化视图的编写;
- 内置了限流系统;
- Request and Response(请求与响应):扩展了常规的HttpResquest和TemplateResponse;
- ViewSet and Routers(视图集和路由):让路由设置更简便;
- …
DRF安装
pip install djangorestframework
pip install markdown # Markdown support for the browsable API.
pip install django-filter # Filtering
pip install coreapi
pip install django-guardian
注意,DRF依赖Django,所以必须要安装Django(pip install django
)。
DRF配置
(1)settings.py
配置
要使用Django REST Framework(DRF), 我们首先需要在全局配置文件(setting.py
)添加'rest_framework'
到INSTALLED_APPS
中。
INSTALLED_APPS = (
...
'rest_framework',
)
REST Framework API的任何全局设置都保存在一个名为REST_FRAMEWORK
的配置字典中,我们可以在settings.py
文件中进行设置,在后面我们再进行设置。
REST_FRAMEWORK = {
...
}
(2)urls.py
配置
在urls.py
文件中配置API文档路由,此路由是后端API的文档地址。
from django.conf.urls import url, include
from rest_framework.documentation import include_docs_urls
urlpatterns = [
...
path('docs/', include_docs_urls(title="中华诗歌")),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
docs是DRF自动生成的文档的路由(title是文档标题),而api-auth是DRF登录的链接。
Serializers实践
Model定义
我们创建了一个名为poet的app,它定义两个极其简单的Model:Poet Model(诗人模型)与Poetry Model(诗歌模型)。
(1)诗人类
from django.db import models
class Poet(models.Model):
name = models.CharField(max_length=30)
dynasty = models.CharField(max_length=10, default="未知")
introduction = models.TextField(blank=True)
def __str__(self):
return self.name
(2)诗歌类
class Poetry(models.Model):
author = models.ForeignKey('Poet', on_delete=models.CASCADE)
title = models.CharField(max_length=100)
content = models.TextField()
def __str__(self):
return self.title
注意:别忘了Django的用法哦,定义完成模型之后别忘了注册app以及makemigrations
、migrate
。当然,还有数据库配置,本文使用的是MySQL数据库,这里给出其配置:
#In settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '',
'USER': '',
'PASSWORD': '',
'HOST': '127.0.0.1',
'OPTIONS': {
'init_command': 'SET default_storage_engine=INNODB;' }#第三方登入需要
}
}
定义View与Serializer
(1)APIView
APIView
是DRF最基础的View,它继承的是Django的View(django.views.generic.View
),它在Django View基础上增加了很多功能。
第1版View:APIView类实现Poet Model的列表功能。
from rest_framework.views import APIView
from rest_framework.response import Response
from .model import Poet
from .serializers import PoetSerializer
class PoetListView(APIView):
"""诗人列表"""
def get(self, request, format=None):
poets = Poet.objects.all()
poet_serializers = PoetSerializer(poets, many=True)
return Response(poet_serializers.data)
注意:PoetSerializer(poets, many=True)
代码中PoetSerializer的参数many=True
代表传给它的参数poets是一个列表;如果是单个数据对象,可不配置many参数。
如上示例,和Django View很像,get方法也是处理GET请求;PoetSerializer是Poet模型对象的序列化类,我们只需要获取Poet的列表,然后将列表传给序列化类(PoetSerializer)得到序列化对象(poet_serializers),最后用Response
返回poet_serializers.data。当然,也有post方法,下面给出示例:
from rest_framework import status
def post(self, request, format=None):
"""
因为是诗人数据,用户一般不能创建,这里只给出一个小例子。
serializer.save()方法会调用serializer类的create方法。
即serializer.save()将调用PoetSerializer.create()方法。
"""
serializer = PoetSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
(2)serializers.Serializer
与serializer.ModelSerializer
这里讨论Serializer
与ModelSerializer
,并分别实现第一版View中的PoetSerializer。首先在poet app中创建python文件serializers.py。
-
Serializer
的功能相当于Django的form功能,可以将数据序列化为json。#poet.serializers from rest_framework import serializers from .models import Poet class PoetSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField(max_length=30, required=True