02_View
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源码
02_View的更多相关文章
随机推荐
- 传输json数据到前台的时候,数据中包含日期数据
问题描述 当从数据库中查询的数据中包含有日期格式的数据的时候,数据传输到前台会报错. 解决方式 // 逐条将日期进行格式化后再传输 Date date = new SimpleDateFormat(& ...
- 以php中的自增自自减运算符操作(整型,浮点型,字符串型,布尔型,空类型)数据
// 环境 // // php版本 // PHP 7.0.33-0+deb9u1 (cli) (built: Dec 7 2018 11:36:49) ( NTS ) // Copyright (c) ...
- Python socket编程 (2)--实现文件验证登入
可以实现从客户端输入账号和密码然后发送到服务器进行验证,实现用户登入校正操作. 服务器: import socket import json server = socket.socket() serv ...
- VMware虚拟机(Ubuntu)通过主机代理实现——浏览器+终端访问外网
环境说明:主机win10 + 虚拟机ubunut16.04 + 主机s-h-a-d-o-w-socks win10 主机相关操作配置1: 按下 Win + R 快捷键,输入 cmd ,然后在命令行中输 ...
- Scala 算法案例
移除第一个负数之后的所有负数 // 构建数组 val a = ArrayBuffer[Int]() a += (1, 2, 3, 4, 5, -1, -3, -5, -9) // 每发现一个第一个负数 ...
- netty--buffer分配策略
AdaptiveRecvByteBufAllocator 动态分配buffer大小的类. 如果前一次读取完全填满了分配的缓冲区,它将逐渐增加预期的可读字节数.(增加的方式:初始化类的时候,会预先设置好 ...
- 第二次用map23333
度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如, ...
- C# EF 加密连接数据库连接字符串
不多说,直接上代码 public partial class Model1 : DbContext { private static string connStr = ""; pu ...
- css 垂直方向 margin 边距 重合
1:控制两个相邻边盒子之间的距离,在A或者B盒子上用margin控制,就可以控制距离了. 2:父子级之间的元素,常规文档流中,只要垂直外边距直接接触就会发生合并.比如在写header标签时,想移动he ...
- table固定宽度与自动宽度
table-layout:auto(创建的table默认是此布局模式): 对table和td.th指定的宽度无效,浏览器会计算所有单元格的内容宽度才能得出一列宽度 如果想对单元格的内容自动折行需使用w ...