Django REST framework 介绍

Django REST framework介绍

现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势。

显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别是把Django作为自己主要的开发框架的程序员,Django REST framework(DRF)这个API框应该是要学的。

Django REST framework(DRF)框架文档齐全,社区较稳定,而且由于它是基于Django这个十分全面的框架而设计开发的,能够让开发者根据自己的业务需要,使用极少的代码量快速的开发一套符合RESTful风格的API,并且还支持自动生成API文档。

Django REST framework(DRF)官网http://www.django-rest-framework.org/

Django REST framework中文文档: Django REST framework 官方中文文档

Django REST framework github: github

Django REST framework需要以下依赖:

  • Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
  • Django (1.10, 1.11, 2.0)

DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)

  1. 安装DRF
1
pip install djangorestframework
  1. 添加rest_framework应用

我们利用在Django框架学习中创建的demo工程,在settings.py的INSTALLED_APPS中添加’rest_framework’。

1
2
3
4
5
INSTALLED_APPS = [
...
'rest_framework',
]
# 接下来就可以使用DRF进行开发了。

简单配置

认证Authentication

第一种:

1
2
3
4
5
6
REST_FRAMEWORK = {  
'DEFAULT_AUTHENTICATION_CLASSES’: (
'rest_framework.authentication.BasicAuthentication’, # 基本认证
'rest_framework.authentication.SessionAuthentication’, # session认证
)
}

第二种:在需要的视图中进行添加认证

1
2
3
4
5
6
7
from rest_framework.authentication import SessionAuthentication, BasicAuthentication  
from rest_framework.views import APIView


class ExampleView(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)

权限Permissions

第一种:可以在配置文件中设置默认的权限管理类,如

1
2
3
4
5
REST_FRAMEWORK = {  
'DEFAULT_PERMISSION_CLASSES’: (
'rest_framework.permissions.IsAuthenticated’,
)
}

如果未指明,则采用如下默认配置

1
2
3
'DEFAULT_PERMISSION_CLASSES’: (  
'rest_framework.permissions.AllowAny’,
)

第二种:在需要的视图中进行添加权限

1
2
3
4
5
6
7
from rest_framework.permissions import IsAuthenticated  
from rest_framework.views import APIView


class ExampleView(APIView):
permission_classes = (IsAuthenticated,)

限流Throttling

第一种:

1
2
3
4
5
6
7
8
9
10
REST_FRAMEWORK = {  
'DEFAULT_THROTTLE_CLASSES’: (
'rest_framework.throttling.AnonRateThrottle’,
'rest_framework.throttling.UserRateThrottle
),
'DEFAULT_THROTTLE_RATES’: {
'anon’: '100/day’,
'user’: '1000/day’
}
}

第二种:在需要的视图中进行添加限流

1
2
3
4
5
6
from rest_framework.throttling import UserRateThrottle  
from rest_framework.views import APIView

class ExampleView(APIView):
throttle_classes = (UserRateThrottle,)

过滤Filtering

1
先安装扩展包:pip insall django-filter

第一种:

1
2
3
4
5
6
7
8
INSTALLED_APPS = [  

'django_filters’, # 需要注册应用,
]

REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS’: ('django_filters.rest_framework.DjangoFilterBackend’,)
}

第二种:在视图中添加过滤属性

1
2
3
4
class BookListView(ListAPIView):  
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
filter_fields = ('btitle’, 'bread’)

排序

在视图中直接设置:

1
2
3
4
5
class BookListView(ListAPIView):  
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
filter_backends = [OrderingFilter]
ordering_fields = ('id’, 'bread’, 'bpub_date’)

分页Pagination

第一种:

1
2
3
4
REST_FRAMEWORK = {  
'DEFAULT_PAGINATION_CLASS’: 'rest_framework.pagination.PageNumberPagination’,
'PAGE_SIZE’: 100 # 每页数目
}

注意:如果在视图内关闭分页功能,只需在视图内设置
pagination_class = None

第二种:也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。

1
2
3
4
5
6
7
8
9
class LargeResultsSetPagination(PageNumberPagination):  
page_size = 1000
page_size_query_param = 'page_size’
max_page_size = 10000

class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
pagination_class = LargeResultsSetPagination

异常处理 Exceptions

REST framework提供了异常处理,我们可以自定义异常处理函数。

1
2
3
4
5
6
7
8
9
from rest_framework.views import exception_handler  
def custom_exception_handler(exc, context):
# 先调用REST framework默认的异常处理方法获得标准错误响应对象
response = exception_handler(exc, context)
# 在此处补充自定义的异常处理
if response is not None:
response.data['status_code'] = response.status_code

return response

在配置文件中声明自定义的异常处理

1
2
3
REST_FRAMEWORK = {  
'EXCEPTION_HANDLER’: 'my_project.my_app.utils.custom_exception_handler
}

如果未声明,会采用默认的方式,如下

1
2
3
REST_FRAMEWORK = {  
'EXCEPTION_HANDLER’: 'rest_framework.views.exception_handler
}

自动生成接口文档

安装依赖:pip install coreapi

设置接口文档访问路径:在总路由中添加接口文档路径。
文档路由对应的视图配置为rest_framework.documentation.include_docs_urls,
参数title为接口文档网站的标题。

1
2
3
4
5
from rest_framework.documentation import include_docs_urls  
urlpatterns = [

url(r’^docs/’, include_docs_urls(title=’My API title’))
]

文档描述说明的定义位置

1) 单一方法的视图,可直接使用类视图的文档字符串,如

1
2
3
4
5
6
7
class BookListView(generics.ListAPIView):  
"""
返回所有图书信息.
"""
```

2)包含多个方法的视图,在类视图的文档字符串中,分开方法定义,如

class BookListCreateView(generics.ListCreateAPIView):
“””
get:
返回所有图书信息.

post:
新建图书.
"""
1
2

3)对于视图集ViewSet,仍在类视图的文档字符串中分开定义,但是应使用action名称区分,如

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
“””
list:
返回图书列表数据

retrieve:
返回图书详情数据

latest:
返回最新的图书数据

read:
修改图书的阅读量
"""


Django REST framework 介绍
https://flepeng.github.io/021-Python-32-框架-Django-REST-framework-Django-REST-framework-介绍/
作者
Lepeng
发布于
2021年8月18日
许可协议