django-reset-framework
-
安装
pip install djangorestframework # 依赖包 pip install markdown django-filter coreapi django-guardian
Add
'rest_framework'
to yourINSTALLED_APPS
setting.-
在 urls 配置以下 url
path('docs', include_docs_urls(title='')), # title任意 path('api-auth', include('rest_framework.urls')),
django-reset-framework 的作用主要是序列化 model,返回给网页 json 格式的数据,其使用有点类似 django 的 Form
-
django 的 forms 和 drf 的 serializers 比较
from rest_framework import serializers from django import forms forms.Form 对应 serializers.Serializer froms.ModelForm 对应 serializers.ModelSerializer class ModelNameSeriazer(serializers.ModelSerializer): class Meta: model = ModelName fields = '__all__' # 表示序列化该model的所有属性
-
drf的view
最基类 View 为
from rest_framework.views import APIView
返回值为from rest_framework.response import Response
。 -
View 高级用法
from rest_framework import mixins, generics # 编写 View 时,集成上面两个文件中的类,重写相关方法 # 例子 class GoodsListView(generics.ListAPIView): """ 商品列表页 """ serializer_class = GoodsSerializer queryset = Goods.objects.all()[:10] lookup_field = 'goods_id' # 配置获取详情时,搜索字段名称
-
drf 实现分页
- 在setting中设置
# 在setting中作如下设置 REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10, # 每页显示数量 }
-
继承PageNumberPagination类
class MyPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' max_page_size = 100 page_query_param = 'p'
在 View 里设置 pagination_class = MyPagination,ok!
drf 里 View 的层级关系
-
drf 过滤器
To use
DjangoFilterBackend
, first installdjango-filter
. Then adddjango_filters
to Django'sINSTALLED_APPS
-
在 view 里配置过滤字段
from django_filters.rest_framework import DjangoFilterBackend class UserListView(generics.ListAPIView): ... filter_backends = [DjangoFilterBackend] filter_fields = ['name', 'price'] # 精确搜索字段,必须完全一致 filterset_fields = ['', '' ] # 同上,精确搜索,必须完全一致;外键搜索时,使用双下划线指向外键的名字 # 配置搜索字段,使用from rest_framework import filters filter_backends = [filters.SearchFilter,] search_fields = ('name',) # 排序过滤字段,使用from rest_framework import filters filter_backends = [filters.OrderingFilter,] ordering_fields = ['shop_price', 'name']
-
编写对于的 Filter 类实现过滤
from django_filters import rest_framework as filters from .models import Goods class GoodsFilters(filters.FilterSet): # price_min = filters.NumberFilter(field_name='shop_price', lookup_expr='gte') # 大于等于 # price_max = filters.NumberFilter(field_name='shop_price', lookup_expr='lte') # 小于等于 # name = filters.CharFilter(field_name='name', lookup_expr='contains') # 模糊查询,忽略大小写设置为icontains class Meta: model = Goods fields = ['category__name'] # 按照范围过滤 # fields = { # 'shop_price': ['lt', 'gt'], # } # 最后在需要的 View 添加属性:filter_class = ModelFilterClassName
-
-
drf 登录认证机制
1)install_apps 中添加
'rest_framework.authtoken'
2)url 中配置
from rest_framework.authtoken import views path('api-token-auth/', views.obtain_auth_token),
-
添加全局设置
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', # 以上是默认的 # 使用Token认证机制需要添加如下 'rest_framework.authentication.TokenAuthentication', ] }
-
在 view 中设置属性,局部配置
from rest_framework.authentication import TokenAuthentication authentication_classes = (TokenAuthentication, )
以上两种方式都可以配置 TokenAuth 认证
-
-
前后端分离时一般使用 JWT 用户认证
1)
pip install djangorestframework-jwt
2)JWT 配置添加
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', # 添加如下配置 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), }
3)url 配置
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ url(r'^api-token-auth/', obtain_jwt_token), ]
3)JWT 验证机制,最好在 ViewSet 中添加
authentication_classes = (JSONWebTokenAuthentication,)
,全局配置会导致不需要登录的信息获取失败。 -
Django 信号量
django 中有信号量机制,比如创建 user 时需要做一些其它逻辑,就可以使用信号量。
例子:
from django.db.models.signals import post_save from django.dispatch import receiver from .models import UserFav @receiver(post_save, sender=UserFav) def create_userfav(sender, instance=None, created=False, **kwargs): if created: goods = instance.goods goods.fav_num += 1 goods.save() # apps from django.apps import AppConfig class UserOperationConfig(AppConfig): name = 'user_operation' verbose_name = '用户操作管理' # 使用信号量 def ready(self): import user_operation.signals
-
动态配置 ViewSet 中的权限认证和 serializer 类
# 动态配置serializer类 def get_serializer_class(self): if self.action == 'retrieve': return UserDetailSerializer elif self.action == 'create': return UserRegSerializer return UserDetailSerializer # 动态设置权限 def get_permissions(self): if self.action == 'retrieve': return [permissions.IsAuthenticated()] elif self.action == 'create': return [] return []
-
Serializer 嵌套 Serializer
源码级别,序列化 Image 字段,它会判断上下文是否有 request,有的话会加上域名。
如果调用的 Serializer 里需要序列化图片字段,则需要添加 context 的 request 属性,否则它不会自动添加域名。
goods_json = GoodsSerializer(goods_ins, many=False, context={'request': self.context['request']}).data
-
drf 配置限速
setting 里配置:
REST_FRAMEWORK = { # 两个限速类 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', # 用户没有登录 'rest_framework.throttling.UserRateThrottle' # 用户登录 ], 'DEFAULT_THROTTLE_RATES': { 'anon': '100/day', 'user': '1000/day' } }
ViewSet 中添加属性
from rest_framework.throttling import UserRateThrottle, AnonRateThrottle throttle_classes = (UserRateThrottle, AnonRateThrottle)