• DRF请求与响应


    目录

    Request类

    常用参数

    Response类

     请求编码与相应编码

    相应编码


    Request类

    经过rest framwork 传入视图函数的request已经不是原来的request了, 而是Request的类产生的对象request.

    rest framwork 提供了Parser解析器, 在收到请求后会根据Content-Type知名的请求数据类型,如JSON,表单等. 将请求数据进行parse解析, 解析为类字典[QueryDict]对象保存到Request对象中.

    Request对象的数据是自动根据前端发送数据的格式进行讲解细致和的结果

    常用参数

    data

    POST,PUT,PATCH请求方式解析后的数据,, (原生django的PUT请求再request.POST中取不到)

    query_params

    与原生的GET一样. 

    其他的方法和原来的request使用方法一致.

    底层原理: 在Request实例化对象时, self._request=request, 将原来的request对象给了Request的对象, 又在Request类中定义了__getattr__魔法方法, 挡在视图函数中获取request对象的属性和方法时, 找不到就会触发魔法方法的执行, 利用反射获取原来的request对象中的方法

    1. def __getattr__(self, attr):
    2. """
    3. If an attribute does not exist on this instance, then we also attempt
    4. to proxy it to the underlying HttpRequest object.
    5. """
    6. try:
    7. return getattr(self._request, attr)
    8. except AttributeError:
    9. return self.__getattribute__(attr)

    Response类

    实例化参数

    • data(列表胡总和字典, 序列化成json字符串返回给前端)
    • status(响应状态码, 默认是200: from rest_framework.status import HTTP_200_OK)
    • headers(响应头, 以字典的形式返回给前端)
    • content_type(乡音编码格式)
    • template_name(指定模板)
    1. class Test(APIView):
    2. def get(self, request):
    3. return Response(data={}, status=status.HTTP_201_CREATED, headers={'name': 'yietong'})

     请求编码与相应编码

    能够解析的请求编码

    drf默认能够解析urlencoded, form-data,json

    其实是通过配置文件配置的, 在rest_framwork包下的settings.py中

    1. DEFAULTS = {
    2. # Base API policies
    3. 'DEFAULT_PARSER_CLASSES': [
    4. 'rest_framework.parsers.JSONParser', # 可以解析json格式
    5. 'rest_framework.parsers.FormParser', # 可以解析urlencoded格式
    6. 'rest_framework.parsers.MultiPartParser' # 可以解析form-data格式
    7. ],

     想在项目中配置REST_FRAMEWORK,需要像下边这样在项目配置文件中配置。

    1. """
    2. Settings for REST framework are all namespaced in the REST_FRAMEWORK setting.
    3. For example your project's `settings.py` file might look like this:
    4. REST_FRAMEWORK = {
    5. 'DEFAULT_RENDERER_CLASSES': [
    6. 'rest_framework.renderers.JSONRenderer',
    7. 'rest_framework.renderers.TemplateHTMLRenderer',
    8. ],
    9. 'DEFAULT_PARSER_CLASSES': [
    10. 'rest_framework.parsers.JSONParser',
    11. 'rest_framework.parsers.FormParser',
    12. 'rest_framework.parsers.MultiPartParser',
    13. ],
    14. }
    15. """

    如果想让视图函数只解析指定格式的方法:
    方式一:
    在项目的settings.py中配置REST_FRAMEWORK。

    1. REST_FRAMEWORK = {
    2. 'DEFAULT_PARSER_CLASSES': [
    3. 'rest_framework.parsers.JSONParser',
    4. # 'rest_framework.parsers.FormParser',
    5. # 'rest_framework.parsers.MultiPartParser',
    6. ],
    7. }

    方式二:
    在视图类中定义parser_classes属性。

    1. class Test(APIView):
    2. from rest_framework.parsers import JSONParser, MultiPartParser, FormParser
    3. parser_classes = [JSONParser]
    4. def post(self, request):
    5. return Response(request.data)

     

     总结:解析类的执行顺序,先执行视图类自己的,在执行项目配置文件中的,最后执行rest_framework里的配置文件。

    相应编码

    默认情况下,相应编码是根据客户端的类型而定的,浏览器访问的话相应编码就是text/html,postman的相应编码是application/json。

    配置相应编码格式也是两种方式

    方式一:配置文件中配置

    1. 'DEFAULT_RENDERER_CLASSES': [
    2. 'rest_framework.renderers.JSONRenderer', # 只能相应json格式数据
    3. # 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览器格式
    4. ],

    方式二:在视图类中配置

    1. from rest_framework.renderers import JSONRenderer, BaseRenderer
    2. renderer_classes = [BaseRenderer]

  • 相关阅读:
    Web自动化测试(4)-关键字驱动
    MySQL的事务
    ESP32-BLE基础知识
    three.js 聚光灯阴影
    tflite 学习——生成.tflite 模型与验证
    后端研发工程师面经——计算机网络
    Springboot泊车收费管理系统97439计算机毕业设计-课程设计-期末作业-毕设程序代做
    GBPC1510W-ASEMI铝底塑壳针脚高散热方桥GBPC1510W
    Nodejs+vue热门游戏网游推荐网站系统 s5832
    bean属性注入的方式及AOP的概述
  • 原文地址:https://blog.csdn.net/weixin_67531112/article/details/127114478