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)
- 安装DRF
1
| pip install djangorestframework
|
- 添加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’)
|
第一种:
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): 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:
修改图书的阅读量
"""