ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

02_View

2019-12-13 15:54:09  阅读:323  来源: 互联网

标签:02 request 视图 framework classes import view 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,request,视图,framework,classes,import,view,View
来源: https://www.cnblogs.com/venicid/p/12035522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有