心蓝的博客 心蓝的博客
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

心蓝

人生苦短,我用python
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • 零基础

  • 专项

  • web框架

    • django框架

    • drf

      • 简介
      • 序列化器
      • 请求和响应
        • 请求对象
        • 响应对象
        • 视图包装器
        • 函数视图
        • 可浏览的api
        • 为url添加可选的格式后缀
      • 类视图
      • 视图集和路由器
      • 序列化器补充
      • 身份验证与权限
      • 分页与限流
  • python
  • web框架
  • drf
心蓝
2022-12-26
目录

请求和响应

# 请求和响应

# 请求对象

REST框架引入了一个扩展了常规HttpRequest的请求对象, 并提供更灵活的请求解析。请求对象的核心功能是属性request.data,这与request.POST类似,但对于WebAPIs更有用。

request.POST  # 只能处理post请求的表单数据
request.data  # 处理所有请求的所有格式的数据
1
2

# 响应对象

REST framework还引入了一个响应对象,这是一种TemplateResponse类型,它接受未渲染的内容,并使用内容协商来确定返回给客户端的正确内容类型。

return Response(data)  # Renders to content type as requested by the client.
1

# 视图包装器

要使用REST framework的请求和响应,需要对django的视图进行包装。

REST framework提供了两个包装器:

  • 装饰器api_view用来装饰基本的函数视图。
  • APIview类用来创建类视图。

# 函数视图

接下来使用api_view装饰器重新学生增删改查功能,代码如下:

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response


@api_view(['get', 'post'])
def student_list_or_create(request):
    """
    学生列表,学生创建视图
    """
    if request.method == 'GET':
        objs = Student.objects.all()
        serializer = StudentSerializer(objs, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':

        serializer = StudentSerializer(data=request.data)
        # 3. 校验
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])
def Student_detail(request, pk):
    """
    学生详情,学生更新,学生删除
    """
    try:
        obj = Student.objects.get(pk=pk)
    except Student.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = StudentSerializer(obj)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = StudentSerializer(obj, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        obj.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

装饰器api_view的第一个参数是个列表,表示修饰的视图函数将会处理的http请求。

上面的代码较之前更简洁,不需要再通过request.body处理json格式的请求,直接使用request.data。

返回的响应使用了REST framework的Response,并且使用了命令状态码status.HTTP_400_BAD_REQUEST,响应的含义更加明显了。

就这。。

# 可浏览的api

使用REST framework构建的API具有类容协商的功能,它会根据客户端的请求响应不同类型的数据。

默认请情况下,当你在浏览器里访问API时,它会返回HTML格式的的内容。

这使得你的API变得可浏览,对于开发和调试非常方便。

# 为url添加可选的格式后缀

默认的内容协商是通过请求头中的Accept来控制响应数据的格式。

http http://127.0.0.1:8000/students/ Accept:application/json  # Request JSON
http http://127.0.0.1:8000/students/ Accept:text/html         # Request HTML
1
2

还可以给API添加格式后缀的支持,使用格式后缀可以通过url明确的获取指定格式的响应。

首先向两个视图添加一个format关键字参数,如下所示。

def student_list(request, format=None):
def student_detail(request, pk, format=None):
1
2

现在稍微更新一下crm/urls.py文件,在现有url之外附加一组format_suffix_patterns。

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from projects import views

urlpatterns = [
    path('students/', views.project_list),
    path('students/<int:pk>', views.project_detail),
]

urlpatterns = format_suffix_patterns(urlpatterns)
1
2
3
4
5
6
7
8
9
10

接下来,通过添加格式后缀json或api就可以获取不同格式的响应了。

http http://127.0.0.1:8000/projects.json  # JSON suffix
http http://127.0.0.1:8000/projects.api   # Browsable API suffix
1
2

本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。

#drf
上次更新: 2022/12/26, 16:59:39
序列化器
类视图

← 序列化器 类视图→

最近更新
01
requests让接口测试如此简单 原创
03-31
02
最简明的python正则教程
03-30
03
pycharm激活码
12-30
更多文章>
Theme by Vdoing | Copyright © 2019-2025 心蓝
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式