Django REST Framework学习笔记

这篇博客详述了Django REST Framework(DRF)的使用,包括DRF的特性、安装配置、序列化实践、分页设置、过滤、搜索与排序、用户认证、权限控制、缓存与IP速率限制等内容,旨在帮助读者快速掌握构建RESTful API的方法。
摘要由CSDN通过智能技术生成

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以及makemigrationsmigrate。当然,还有数据库配置,本文使用的是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.Serializerserializer.ModelSerializer

这里讨论SerializerModelSerializer,并分别实现第一版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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值