别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2025 面试记录
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2025 面试记录
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 辨析

  • Sockets编程

  • Django

    • Django 学习资料收集
    • Django-REST-framework教程中文版

      • Django-REST-framework 教程中文版
      • 快速入门
        • 项目设置
        • 序列化
        • Views
        • URLs
        • Pagination
        • Settings
        • 测试
      • 教程 1:序列化
      • 教程 2:Requests 和 Responses
      • 教程 3:类视图
      • 教程 4:认证和权限
      • 教程 5:Relationships 和 Hyperlinked
      • 教程 6:ViewSets 和 Routers
  • stackoverflow

  • Flask

  • 全栈之路

  • 面试

  • 代码片段

  • 异步编程

  • 😎Awesome资源

  • PEP

  • Python工匠系列

  • 高阶知识点

  • Python 学习资源待整理
  • 设计模式

  • 好“艹蛋”的 Python 呀!
  • FIFO | 待学清单📝
  • pip 安装及使用
  • 数据分析

  • 源码阅读计划

  • OOP

  • 关于 python 中的 setup.py
  • 并行分布式框架 Celery
  • 七种武器,让你的代码提高可维护性
  • 使用 pdb 调试 Python 代码
  • 每周一个 Python 标准库
  • 🐍Python
  • Django
  • Django-REST-framework教程中文版
佚名
2021-04-13
目录

快速入门

在这里我们创建一个简单的 API,允许管理员查看、编辑用户和组信息。

# 项目设置

新建名为tutorial的 django 项目并在其中建立一个名为quickstart的 APP:

# 新建目录
mkdir tutorial
cd tutorial

# 新建虚拟环境
python3 -m venv env
source env/bin/activate  # Windows平台使用 `env\Scripts\activate`

# 在虚拟环境中安装依赖
pip install django
pip install djangorestframework

# 新建项目
django-admin startproject tutorial .  # 注意最后面的 '.'
cd tutorial
django-admin startapp quickstart
cd ..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

此时目录结构应该如下所示:

$ pwd
<some path>/tutorial
$ find .
.
./manage.py
./tutorial
./tutorial/__init__.py
./tutorial/quickstart
./tutorial/quickstart/__init__.py
./tutorial/quickstart/admin.py
./tutorial/quickstart/apps.py
./tutorial/quickstart/migrations
./tutorial/quickstart/migrations/__init__.py
./tutorial/quickstart/models.py
./tutorial/quickstart/tests.py
./tutorial/quickstart/views.py
./tutorial/settings.py
./tutorial/urls.py
./tutorial/wsgi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

应用程序是在项目目录中创建的,这看起来很不寻常。使用项目的命名空间避免了与外部模块的名称冲突(这是一个超出“快速入门”范围的主题)。

使用下面的命令初始化数据库:

python manage.py migrate
1

然后创建一个用户名为admin密码为password123的管理员:

python manage.py createsuperuser --email admin@example.com --username admin
1

以上设置完成后,进入 APP 的目录来编写代码...

# 序列化

首先我们创建一个文件tutorial/quickstart/serializers.py来编写序列化相关的代码:

from django.contrib.auth.models import User, Group
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')
1
2
3
4
5
6
7
8
9
10
11
12
13
14

注意在上面的代码中我们使用了HyperlinkedModelSerializer来建立超链接关系,你也可以使用主键或其他关系,但 hyperlinking 是一个好的 RESTful 设计。

# Views

现在让我们来编写视图文件tutorial/quickstart/views.py:

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

我们把许多常见的操作都封装在了类ViewSets中,这样就不用编写重复代码了。当然你可以按照自己的需求编写 view,但使用ViewSets可以保持 view 代码的简洁以及逻辑的清晰。

# URLs

接下来编写tutorial/urls.py:

from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

# 使用URL路由来管理我们的API
# 另外添加登录相关的URL
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

因为我们使用了ViewSets,所以我们可以通过使用 Router 类来自动生成 URL 配置信息。

重申一次,如果需要更自主的配置 URL,可以使用常规的类视图以及显式编写 URL 配置。

最后我们添加了默认的登录、登出视图在浏览 API 时候使用,这是一个可选项,但如果你想在浏览 API 时使用认证功能这是非常有用的。

# Pagination

分页使您可以控制每页返回多少对象。为了启用它,将以下行添加到 tutorial/settings.py:


REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'PAGE_SIZE': 10
}
1
2
3
4
5

# Settings

将'rest_framework'到INSTALLED_APPS,该配置位于tutorial/settings.py:

INSTALLED_APPS = (
    ...
    'rest_framework',
)
1
2
3
4

至此,我们完成了全部工作。

# 测试

现在我们来测试我们的 API,在终端中输入:

python manage.py runserver
    
1
2

现在我们可以使用命令行工具访问 API 了,比如curl:

    curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/users/
    {
        "count": 2,
        "next": null,
        "previous": null,
        "results": [
            {
                "email": "admin@example.com",
                "groups": [],
                "url": "http://127.0.0.1:8000/users/1/",
                "username": "admin"
            },
            {
                "email": "tom@example.com",
                "groups": [                ],
                "url": "http://127.0.0.1:8000/users/2/",
                "username": "tom"
            }
        ]
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

或者使用 httpie (opens new window) 命令行工具:

http -a admin:password123 http://127.0.0.1:8000/users/

HTTP/1.1 200 OK
...
{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "email": "admin@example.com",
            "groups": [],
            "url": "http://localhost:8000/users/1/",
            "username": "paul"
        },
        {
            "email": "tom@example.com",
            "groups": [                ],
            "url": "http://127.0.0.1:8000/users/2/",
            "username": "tom"
        }
    ]
}
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

或者直接打开浏览器:

如果使用浏览器,请确保已经使用右上角的登录功能登录。

好极了,就是这么简单!

如果您想更深入地了解 REST 框架如何组合在一起,请继续阅读本教程 ,或者开始浏览 API 指南。

编辑 (opens new window)
#DRF
上次更新: 2024-07-23, 01:00:43
Django-REST-framework 教程中文版
教程 1:序列化

← Django-REST-framework 教程中文版 教程 1:序列化→

最近更新
01
2025 面试记录
05-28
02
提升沟通亲和力的实用策略
03-26
03
工作
07-15
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式