随着 Kubernetes 和微服务架构的兴起,能够快速编写和部署 RESTful API 服务是一项很好的技能。 在系列文章的第一部分中,您将学习如何使用 Fedora 构建一个 RESTful 应用程序并将其部署在 Openshift 上。 我们将一起为“待办事项”应用程序构建后端。
API 允许您创建、读取、更新和删除 (CRUD) 一个任务。 任务存储在数据库中,我们使用 Django ORM(对象关系映射)来处理数据库管理。
Django App 和 Rest 框架设置
在一个新目录中,创建一个 Python 3 虚拟环境,以便您可以安装依赖项。
$ mkdir todoapp && cd todoapp
$ python3 -m venv .venv
$ source .venv/bin/activate
激活虚拟环境后,安装依赖项。
(.venv)$ pip install djangorestframework django
Django REST 框架,或 DRF,是一个可以轻松创建 RESTful CRUD API 的框架。 默认情况下,它可以访问有用的功能,例如可浏览的 API、身份验证管理、数据序列化等。
创建 Django 项目和应用程序
使用 django- 创建 Django 项目admin 提供 CLI 工具。
(.venv) $ django-admin startproject todo_app . # Note the trailing '.'
(.venv) $ tree .
.
├── manage.py
└── todo_app
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
接下来,在项目中创建应用程序。
(.venv) $ cd todo_app
(.venv) $ django-admin startapp todo
(.venv) $ cd ..
(.venv) $ tree .
.
├── manage.py
└── todo_app
├── __init__.py
├── settings.py
├── todo
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── urls.py
└── wsgi.py
现在项目的基本结构已经到位,您可以启用 REST 框架和 todo 应用程序。 让我们将 rest_framework 和 todo 添加到项目 settings.py 中的 INSTALL_APPS 列表中。
todoapp/todo_app/settings.py
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'todo_app.todo',
]
应用模型和数据库
构建我们的应用程序的下一步是设置数据库。 默认情况下,Django 使用 SQLite 数据库管理系统。 小号因斯 SQLite 运行良好并且在开发过程中易于使用,让我们保持这个默认设置。 本系列的第二部分将介绍如何将 SQLite 替换为 PostgreSQL 在生产中运行应用程序。
任务模型
通过将以下代码添加到 todo_app/todo/models.py,您可以定义哪些属性具有任务。 应用程序定义了一个带有标题、描述和状态的任务。 任务的状态只能是以下三种状态之一:Backlog、Work in Progress 和 Done。
from django.db import models
class Task(models.Model):
STATES = (("todo", "Backlog"), ("wip", "Work in Progress"), ("done", "Done"))
title = models.CharField(max_length=255, blank=False, unique=True)
description = models.TextField()
status = models.CharField(max_length=4, choices=STATES, default="todo")
现在创建 Django 用来更新数据库的数据库迁移脚本。
(.venv) $ PYTHONPATH=. DJANGO_SETTINGS_MODULE=todo_app.settings django-admin makemigrations
然后,您可以将迁移应用到数据库。
(.venv) $ PYTHONPATH=. DJANGO_SETTINGS_MODULE=todo_app.settings django-admin migrate
此步骤在应用程序的根目录中创建一个名为 db.sqlite3 的文件。 这是 SQLite 存储数据的地方。
访问数据
创建视图
现在您可以在数据库中表示和存储任务,您需要一种访问数据的方法。 这是我们开始使用 Django REST 框架的地方,通过使用 模型视图集. ModelViewSet 在数据模型上提供以下操作:列出、检索、创建、更新、部分更新和销毁。
让我们将视图添加到 todo_app/todo/views.py:
from rest_framework import viewsets
from todo_app.todo.models import Task
from todo_app.todo.serializers import TaskSerializer
class TaskViewSet(viewsets.ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
创建序列化程序
如您所见,TaskViewSet 正在使用 串行器. 在 DRF 中,序列化程序将应用程序模型中建模的数据转换为原生 Python 数据类型。 这种数据类型可以在以后轻松地呈现为 JSON 或 XML,例如 example. 序列化器还用于将 JSON 或其他内容类型反序列化为模型中定义的数据结构。
让我们通过在项目 todo_app/todo/serializers.py 中创建一个新文件来添加我们的 TaskSerializer 对象:
from rest_framework.serializers import ModelSerializer
from todo_app.todo.models import Task
class TaskSerializer(ModelSerializer):
class Meta:
model = Task
fields = "__all__"
我们使用泛型 模型序列化器 从 DRF 中,自动创建一个序列化程序,其中包含与我们的任务模型相对应的字段。
现在我们有了数据模型、视图和序列化/反序列化数据的方法,我们需要将视图操作映射到 URL。 这样我们就可以使用 HTTP 方法来操作我们的数据。
创建路由器
在这里,我们再次使用 Django REST 框架的强大功能和 默认路由器. DRF DefaultRouter 负责将操作映射到 HTTP 方法和 URL。
在我们看到更好的之前 example DefaultRouter 为我们做了什么,让我们添加一个新的 URL 来访问我们之前创建的视图。 将以下内容添加到 todo_app/urls.py:
from django.contrib import admin
from django.conf.urls import url, include
from rest_framework.routers import DefaultRouter
from todo_app.todo.views import TaskViewSet
router = DefaultRouter()
router.register(r"todo", TaskViewSet)
urlpatterns = [
url(r"admin/", admin.site.urls),
url(r"^api/", include((router.urls, "todo"))),
]
如您所见,我们正在将我们的 TaskViewSet 注册到 DefaultRouter。 然后,我们将所有路由器 URL 映射到 /api 端点。 这样,DRF 负责将 URL 和 HTTP 方法映射到我们的视图操作(列表、检索、创建、更新、销毁)。
为了 example,使用 GET HTTP 请求访问 api/todo 端点会调用我们视图的列表操作。 做同样的事情,但使用 POST HTTP 请求调用 create 操作。
为了更好地理解这一点,让我们运行应用程序并开始使用我们的 API。
运行应用程序
我们可以使用 Django 提供的开发服务器来运行应用程序。 此服务器仅应在开发期间使用。 我们将在本教程的第二部分看到如何使用更适合生产的 Web 服务器。
(.venv)$ PYTHONPATH=. DJANGO_SETTINGS_MODULE=todo_app.settings django-admin runserver
Django version 2.1.5, using settings 'todo_app.settings'
Starting development server at https://127.0.0.1:8000/
Quit the server with CONTROL-C.
现在我们可以通过以下 URL 访问应用程序:https://127.0.0.1:8000/api/
DRF 为视图操作提供了一个接口,用于 example 使用以下 URL 列出或创建任务:https://127.0.0.1:8000/api/todo
或使用此 URL 更新/删除现有任务:https://127.0.0.1:8000/api/todo/1

结论
在本文中,您学习了如何使用 Django REST 框架创建基本的 RESTful API。 在本系列的第二部分,我们将更新此应用程序以使用 PostgreSQL 数据库管理系统,并将其部署在 OpenShift 中。
该应用程序的源代码可在 GitHub.