Django REST framework 介绍
Django REST framework框架是一个用于构建 Web API 的强大而又灵活的工具. 通常简称为DRF框架 或 REST framework框架.
特点
- 提供了定义序列化器 serializer 的方法,可以快速根据 Django ORM 或者其他库自动序列化/反序列化;
- 提供了丰富的类视图、Mixin扩展类、简化视图的编写;
- 丰富的定制层级: 函数视图、类视图、视图集合到自动生成API,满足各种需求;
- 多种身份认证和权限认证方式的支持;
- 内置了限流系统;
- 直观的API web界面;
- 可扩展性, 插件丰富
官方文档
https://www.django-rest-framework.org/
源码地址
https://github.com/encode/django-rest-framework/tree/master
DRF 框架的安装
1 安装:换 pip 源
pip install djangorestframework
2 配置:在 settings 中注册
INSTALLED_APPS = [ # ... 'rest_framework', ]
3 在 settings 中自定义drf配置
注:drf 配置查找顺序,自定义 settings 的 REST_FRAMEWORK 配置字典 => drf 默认 settings 的DEFAULTS
REST_FRAMEWORK = {}4 drf 的封装特点:特点功能在特点模块下
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.request import Request
示例
""" 1)在models.py创建Model类 from django.db import models class Book(models.Model): name = models.CharField(max_length=64, verbose_name='书名') price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='价格') # 配置类 class Meta: verbose_name_plural = '图书' def __str__(self): return self.name 2)在admin.py中注册Model类,方便在后台(admin)可视化管理数据 from django.contrib import admin from . import models admin.site.register(models.Book) # admin要控制的model都需要注册一下 3)数据库迁移操作 >: python manage.py makemigrations >: python manage.py migrate >: python manage.py createsuperuser admin | Admin123 4)浏览器登录admin录入数据:http://localhost:8000/admin """
基于 restful 接口规范的接口设计
urlpatterns = [ # 资源books接口的设计 url(r'^books/$', views.BookAPIView.as_view()), # 群查、单增 url(r'^books/(?P<pk>d+)/$', views.BookAPIView.as_view()), # 单查、单删、单(整体|局部)改 ]
实现单查群查接口
from rest_framework.views import APIView from rest_framework.response import Response from . import models class BookAPIView(APIView): def _multiple_get(self): # 不能返回,数据是QuerySet[Obj, Obj],也不能强制转换list # return list(models.Book.objects.all()) # QuerySet[dict, dict] # print(models.Book.objects.values('name', 'price')) # QuerySet[tuple, tuple] # print(models.Book.objects.values_list('name', 'price')) return Response(list(models.Book.objects.values('name', 'price'))) def _single_get(self, pk): # return Response(models.Book.objects.filter(pk=pk).values('name', 'price').first()) # 开发阶段建议能用try的地方,不要使用if判断 try: return Response(models.Book.objects.values('name', 'price').get(pk=pk)) except: return Response('资源不存在') # 单查、群查 def get(self, request, *args, **kwargs): pk = kwargs.get('pk') if pk: # 单查逻辑 return self._single_get(pk) else: # 群查逻辑 return self._multiple_get()