zoukankan      html  css  js  c++  java
  • 01_Request和Response

    参考文档

    http://www.iamnancy.top/djangorestframework/Responses/

    https://q1mi.github.io/Django-REST-framework-documentation/api-guide/requests_zh/

    https://www.django-rest-framework.org/api-guide/responses/

    1、Requests

    1、Request类

    Request类扩展了标准的HttpRequest
    request.META 和 request.session 字典可以正常使用
    由于实现原因,Request 类不会从 HttpRequest 类继承,而是使用组合扩展类

    2、request.data

    request.data 返回请求主体的解析内容

    比request.POST 和 request.FILES更加强大

    优点如下:
    它包括所有解析的内容, 包括 文件或非文件 输入。
    它支持解析除POST之外的HTTP方法的内容,这意味着你可以访问PUT和PATCH请求的内容。
    它支持REST framework灵活的请求解析,而不仅仅支持表单数据。 
    例如,你可以以与处理传入表单数据相同的方式处理传入的JSON数据。

    3、request.query_params

    是request.GET的一个更准确的同义词。
    任何HTTP方法类型可能包括查询参数,而不仅仅是GET请求

    4、parsers 解析器

    APIView类或@api_view装饰器将根据view中设置的parser_classes集合或基于DEFAULT_PARSER_CLASSES设置,
    确保此属性自动设置为Parser实例列表。

    Note

    1、错误格式:
    request.data可能会引发ParseError,
    APIView类或@api_view装饰器将捕获错误并返回400 Bad Request响应
    
    2、无法解析的类型的请求
    引发 UnsupportedMediaType 异常,
    该异常并返回 415 Unsupported Media Type 响应

    5、认证器authentication

    1. request.user 

    request.user 通常会返回django.contrib.auth.models.User实例
    未经身份验证的,默认值是django.contrib.auth.models.AnonymousUser实例

    2. request.auth

    request.auth 返回任何附加的认证上下文
    未经认证的,返回None

    3. authenticators

    APIView 类或 @api_view 装饰器将根据视图上设置的 authentication_classes
    DEFAULT_AUTHENTICATORS 设置确保将此属性自动设置为 Authentication 实例列表。

    调用 .user 或 .auth 属性时可能会引发 WrappedAttributeError 异常
    认证器 (authenticator) 作为标准 AttributeError

    6、浏览器增强

    1. request.method

    request.method返回大写的请求方法 PUT,PATCH 和 DELETE 表单

    2. request.content_type

    返回HTTP请求正文的媒体类型的字符串对象

    如果需要定义 
    确实需要访问请求的内容类型,则应该优先使用 .content_type 属性,而不是使用 request.META.get('HTTP_CONTENT_TYPE')

    3. request.stream

    返回一个代表请求主体内容的流。

    2、Response响应

    Response 类是 Django中 SimpleTemplateResponse 类的一个子类

    除非由于某种原因你要对 REST framework 做大量的自定义,

    否则你应该始终对返回对象的views使用 APIView 类或者 @api_view 函数。
    这样做可以确保视图在返回之前能够执行 content negotiation 并且为响应选择适当的渲染器。

    1、创建response

    return Response(data, status=None, template_name=None, headers=None, content_type=None)
    
    
    # 参数:
    data :响应的序列化数据。
    status :响应的状态代码。默认为200。另请参阅状态代码。
    template_name :选择 HTMLRenderer 时使用的模板名称。
    headers :响应中使用的 HTTP headers 的字典。
    content_type :响应的内容类型。通常情况下,渲染器会根据内容协商的结果自动设置,但有些情况下需要明确指定内容类型。

    1、restframework

    Response 类使用的渲染器不能处理复杂的数据类型, 

    所以需要在创建 Response 对象之前将数据序列化为基本数据类型。

    您可以使用 REST framework 的 Serializer 类来执行数据序列化,或者使用您自己的自定义序列化。

    2、django
    与常规 HttpResponse 对象不同,您不会使用渲染的内容实例化 Response 对象。相反,您传递的是未渲染的数据,可能由任何 Python 基元组成。
    例如 Django 模型实例,

    2、属性 Attributes

    res = Response()

    #res.data 
    Request 对象的未渲染内容。
    
    #res.status_code 
    HTTP 响应的数字状态码
    
    #res.content 
    响应的渲染内容。在访问 .content 之前,必须先调用 .render() 方法。
    
    #res.template_name 
    只有当 HTMLRenderer 或其他自定义模板渲染器是响应的渲染器时才需要。 
    比如:之前的代码高亮显示
    
    #res.accepted_renderer
    用于渲染响应的渲染器实例。 
    从视图返回响应之前由 APIView 或 @api_view 自动设置
    
    
    #res.accepted_media_type 
    由 content negotiation 阶段选择的媒体类型。 
    自动通过 APIView 或者 @api_view 在view返回response之前设置 
    
    #res.renderer_context 
    将传递给渲染器的 .render() 方法的附加的上下文信息的字典

    3、标准 HttpResponse 属性

    1. 设置headers

    Response 类扩展了 SimpleTemplateResponse,并且响应中也提供了所有常用的属性和方法
    ```python
    response = Response()
    response['Cache-Control'] = 'no-cache'
    ```

    2. .render()

    调用此方法将响应的序列化数据渲染为最终响应内容

    调用 .render() 时,响应内容将设置为在 accepted_renderer 实例上调用
    .render(data,accepted_media_type,renderer_context) 方法的结果。

    您通常不需要自己调用 .render(),因为它是由 Django 的标准响应循环处理的。

    3、总结

    1、Request和Response

      请求   响应
    restframe   Request+序列化 序列化+Response
    django HttpRequest HttpResponse

    2、request.data与request.query_params

    request.data POST请求
    request.query_params 任何http请求,都有要查询,不仅仅是get

    3、各种解析器,渲染器,xx器

    APIView类或@api_view装饰器,内部自定制的

  • 相关阅读:
    日期时间工具(dayjs)的使用
    Apache JMeter下载使用
    webpack 干货总结
    常见设计模式——模板方法
    常见设计模式——代理模式
    Codeforces Round #340 (Div. 2)E
    HDU 4547
    HDU 2586
    LCA算法的介绍与模板
    1073. 负二进制数相加
  • 原文地址:https://www.cnblogs.com/venicid/p/12034939.html
Copyright © 2011-2022 走看看