1、View

1、基于类的视图 Class-based Views

REST framework提供APIView是Django的View的子类

发送到View的Request请求:是REST framework的Request类的实例,而不是Django的HttpRequest类的实例
View返回的Response响应:返回REST framework的Response,而不是Django的HttpRequest

将请求分派给处理程序方法之前,可以进行如下操作:认证,合适的权限和(或)节流检查

View视图

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User
class ListUser(APIView):
"""
列出系统中的所用用户的视图 * 需要token认证
* 只有管理员用户可以访问这个视图
"""
# authentication_classes = [authentication.TokenAuthentication] # 需要携带token访问
permission_classes = [permissions.IsAdminUser] def get(self, request, format=None):
"""
Return a list of all users.
"""
usernames = [user.username for user in User.objects.all()]
# 方法1:lowb
# queryset = User.objects.all()
# usernames = []
# for user in queryset:
# usernames.append(user.username)
return Response(usernames)

url

from django.urls import path
from .views import ListUser, hello_world, view1, view2 urlpatterns = [
path('user-list', ListUser.as_view()),
]

2、API策略属性

下面这些属性控制了API视图可拔插的那些方面。

3、API 策略实例化方法

下面这些方法被REST framework用来实例化各种可拔插的API策略。你通常不需要重写这些方法。

4、API 策略实现方法

在分派到处理程序方法之前调用以下方法。

5、dispatch 相关方法

1、.initialize_request(self, request, args, *kwargs)

# 初始化request请求,返回Request实例

2、.initial(self, request, args, *kwargs)

运行在调用方法处理程序之前,运行你需要的任何功能。可以执行权限认证,节流限制,内容协商

3、.handle_exception(self, exc)

处理程序方法抛出的任何异常都将传递给此方,通过返回适当的响应,或重新引发错误。

4、.finalize_response(self, request, response, args, *kwargs)

确保从处理程序方法返回的任何 Response 对象都被渲染成正确的内容类型

2、基于函数的视图 (Function Based Views)

说 [基于类的视图] 永远是最好的解决方案是一个错误

REST framework 还允许您使用常规的基于函数的视图

urls

from django.urls import path
from .views import ListUser, hello_world, view1, view2 urlpatterns = [
path('user-list', ListUser.as_view()), # @api_view
path('hello-world', hello_world),
path('view1', view1), # 节流
path('view2', view2), # schema api概要描述
]

1、@api_view()

语法:@api_view(http_method_names=['GET'])

from rest_framework.decorators import api_view

@api_view(http_method_names=['GET', 'POST'])
def hello_world(request):
if request.method == 'POST':
return Response({"message": "Got some data!", "data": request.data})
return Response({"message": "hello world!"})

2、API 策略装饰器 (API policy decorators)

REST framework 提供了一系列可以添加到视图中的附加装饰器

例如,要创建一个使用限流来确保它每天只能由特定用户调用一次的视图,请使用 @throttle_classes 装饰器,传递一个限流类列表:

from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle class OncePerDayUserThrottle(UserRateThrottle): # 节流:一天一次访问器
rate = "1/day" @api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def view1(request):
return Response({"message": "hello for today!see you tomorrow"})

可用的装饰者有:

  • @renderer_classes(...)
  • @parser_classes(...)
  • @authentication_classes(...)
  • @throttle_classes(...)
  • @permission_classes(...)

3、视图模式装饰器 (View schema decorator)

要覆盖基于函数的视图的默认模式生成,您可以使用 @schema 装饰器

###
# 视图模式装饰器 (View schema decorator)
### from rest_framework.schemas import AutoSchema
from rest_framework.decorators import schema class CustomAutoSchema(AutoSchema):
def get_link(self, path, mehod, base_url):
# 这里重写视图,描述该API的概要
pass @api_view(http_method_names=['GET'])
@schema(CustomAutoSchema)
# @schema(None)
def view2(request):
return Response({"message": "hello for today! see you tomorrow!"})

3、总结

1、APIView源码

最新文章

  1. JDBC关于时间的存取
  2. linux下的常用命令
  3. MySQL主从复制与读写分离
  4. 方法过滤器,分布式缓存 Memcached实现Session解决方案
  5. 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的
  6. 后缀数组---New Distinct Substrings
  7. 个人的java web开发书单
  8. 组策略限制添加用户作为服务登录导致ITAtomcat服务无法启动(log on as a service)
  9. centos 火狐浏览器安装adobe flash player插件
  10. 从TableviewCell中获得TableviewController的几种方式
  11. 注册界面设计及实现之(三)SharedPerferences实现数据暂存
  12. Unity3d socket通信 切换到web版本时报错SecurityException解决办法
  13. angularjs购物车效果
  14. 【SysML】用例图
  15. HTML中的行内元素和框元素详解
  16. 网易2019校招内推编程题-俄罗斯方块-C++实现
  17. zabbix实现QQ邮件报警通知--技术流ken
  18. 好消息,Manjaro Linux 18 已正式发布!
  19. __AFO
  20. *args 和**kwargs 的溯源

热门文章

  1. 剑指offer50:数组中重复的数字
  2. Python socket编程 (2)--实现文件验证登入
  3. Golang常用快捷键以及常见快捷键冲突
  4. CentOS 7忘记了root密码解决方案
  5. Markdown笔记(git提交带有emoji的commit描述)
  6. log4net SmtpAppender 踩坑总结
  7. js的变量类型
  8. vue进入页面时不在顶部,检测滚动返回顶部按钮
  9. S5PV210 启动流程
  10. STM8 uart1