第一个功能是表单认证、session认证,认证通过后,就到了权限,这个用户是否有这个权限,
控制用户有哪些资源的访问权限,认证和权限是需要一块使用的。只对继承restframework下的类视图有效
''' AllowAny 允许所有用户 isAdminUser 仅管理用户 lsAuthenticatedOrReadOnly 认证的用户后的用可以获取所有权限,没有货的认证只能有get权限 只有通过认证的用户,才有权限访问 '''
全局配置,在setting文件中加入如下配置
# DRF配置信息
REST_FRAMEWORK = {
# 认证 全局配置形式
'DEFAULT_AUTHENTICATION_CLASS': (
'rest_framework.authentication.BasicAuthentication', # 基本认证
'rest_framework.authentication.SessionAuthentication' # session认证
),
# 权限 全局配置形式
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', #只有通过认证的用户,才有权限访问 ,AllowAny 允许所有用户,isAdminUser 仅管理用户,lsAuthenticatedOrReadOnly 认证的用户后的用可以获取所有权限,没有货的认证只能有get权限
)
}
局部配置,在类视图中加入如下代码
# 认证
authentication_classes = (BasicAuthentication, SessionAuthentication)
# 权限
permission_classes = (IsAuthenticated)
主要针对爬虫来说的,一个用户请求的次数ip地址进行限流。
一种是基于用户的限流,在全局配置文件setting中添加
# 用户限流
'DEFAULT_THROTTLE_CLASSES': ( # 定义限流类
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': { # 定义限流速率,支持秒、分、时、天的限制
'anon': '3/day',
'user': '4/day'
对某个类视图单独进行限流
# 用户限流
throttle_classes = [UserRateThrottle]
一种是基于类视图的限流。在类视图中加入这行代码
在请求数据的时候,按照商品的名称进行过滤,
首先,先安装django-filter模块
pip install django-filter
其次把这个模块当做应用,在seting文件中,注册到django项目中,接下来指定过滤方法
'django_filters',
第三步,在setting文件中指定过滤方法
# 过滤
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
四、在类中指定过滤字段
# 过滤字段
filter_fields = ('btitle', 'bread')
五、使用的时候在路径中,携带查询字符串数据
127.0.0.1:8000/books/?btitle=评论标题
按照销量排序,按照日期排序,按照价格排序
首先,先在类视图中导入排序类,再在类中增加排序方法类 和排序字段
from rest_framework.filters import OrderingFilter
# 指定排序方法类
filter_backends = [OrderingFilter]
#指定排序字段
ordering_fields = ('id', 'bread')
127.0.0.1:8000/books/?ordering-=bread
用在列表页数据中,
分为两种分页器
1、PageNumberPagination,127.0.0.1/books/?page=1&page_size=2
2、LimitOffsetPagination,127.0.0.1/books/?limit=100&offset=400
唯一区别在于参数上
首先,自定义一个分页器
# 自定义一个分页器
class PageNum(PageNumberPagination):
page_size_query_param = 'page_size' # 指定控制每页数量的参数
max_page_size = 6 # 指定每页最大返回数量
在视图类中进行使用
# 指定分页器
pagination_class = PageNum
访问,127.0.0.1/books/?page=1&page_size=2,返回第一页数据,每页返回两条
数据库异常,REST framework不能处理数据库异常,在原来基础上,增加处理数据库异常的方法,这个方法可以全局异常捕获。
自己封装处理异常,通常放在utils文件中
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from django.db import DatabaseError
from rest_framework.response import Response
def exception_handler(exc, context):
response = drf_exception_handler(exc, context)
if response is None:
view = context['view']
if isinstance(exc, DatabaseError):
print('[%s]: %s' % (view, exc))
response = Response({'detail': '服务器内部错误'},
status=status.HTTP_507_INSUFFICIENT_STORAGE)
return response
然后在setting文件中添加配置
# 全局异常处理
'EXCEPTION_HANDLER': 'book_drf.utils.exception_handler'
第一步,先安装模块,pip install coreapi
第二步,把请求路径配置在全局路由中
url(r'^docs/', include_docs_urls(title='My API title')),
然后想看接口文档请求这个路径就可以。
127.0.0.1:8000/docs/
通过在类中加入
"""
返回所有图书信息
"""
"""
get:
返回所有图书信息。
post:
新建图书
"""
添加描述信息,在serializer中的字段,添加help_text
# 序列化返回的字段
btitle = serializers.CharField(max_length=20, min_length=5, help_text='书名信息')