📜  Python Django – 使用 DRF 和 Docker 测试驱动的 Web API 开发(1)

📅  最后修改于: 2023-12-03 15:33:59.701000             🧑  作者: Mango

Python Django - 使用 DRF 和 Docker 测试驱动的 Web API 开发

介绍

Python是当今最流行的编程语言之一,拥有庞大的社区和强大的生态系统。Django是Python最流行的Web框架之一,提供了开箱即用的功能和快速的开发体验。DRF(Django Rest Framework)是Django的一个扩展,用于开发RESTful API。

Docker是一个流行的开源容器化平台,可以通过Docker容器轻松地构建、部署和运行应用程序。通过将应用程序打包在一个容器中,可以提高应用程序的可移植性和可重复性,并确保应用程序在不同的系统上的可靠性。

本教程将介绍如何使用Python Django和DRF以及Docker来构建测试驱动的Web API。

环境

本教程需要安装以下软件:

  • Python 3
  • Docker
开发环境设置

首先,我们需要设置Python虚拟环境。

$ python3 -m venv env
$ source env/bin/activate

接下来,我们需要安装Django和DRF。

$ pip install django djangorestframework

现在,我们可以使用Django CLI创建一个新项目。

$ django-admin startproject api

创建一个应用程序。

$ cd api
$ python manage.py startapp book

添加book应用程序到Django的设置文件中。修改api/settings.py文件。

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'book',
]

现在,我们可以开始编写我们的API。首先,让我们创建一个模型来存储书籍的信息。

# book/models.py

from django.db import models


class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return self.title

接下来,我们需要为我们的模型创建Serializer(序列化器)。Serializer会根据我们的模型来序列化和反序列化请求和响应。

# book/serializers.py

from rest_framework import serializers
from .models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

现在,我们可以创建视图和URL。

# book/views.py

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer


class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
# api/urls.py

from django.urls import include, path
from rest_framework import routers
from book.views import BookViewSet

router = routers.DefaultRouter()
router.register(r'books', BookViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

现在,我们可以运行Django的开发服务器并测试我们的API。

$ python manage.py runserver
使用Docker设置

现在,我们已经编写了一个可以工作的API,我们可以使用Docker来容器化我们的应用程序。

我们需要创建一个Dockerfile文件。

FROM python:3

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . /app

这个Dockerfile使用Python 3镜像作为基础镜像,并且设置了PYTHONDONTWRITEBYTECODEPYTHONUNBUFFERED环境变量,这使得Python在Docker容器中运行得更好。

接下来,让我们创建一个docker-compose.yml文件,以便将应用程序容器化。

version: '3'
services:
  db:
    image: postgres:11
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: api
  app:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db

该文件定义了两个服务:一个Postgres数据库服务和一个app服务。app服务使用前面创建的Dockerfile来构建容器,并使用python manage.py runserver命令来运行Django开发服务器。我们还将该服务的端口映射到主机的端口8000。

接下来,我们可以使用Docker Compose来构建和启动我们的应用程序容器。

$ docker-compose up
容器化测试环境

现在,我们已经将我们的应用程序容器化,我们需要一种方法来容器化我们的测试环境。

我们可以创建一个名为test.yml的新Docker Compose文件来定义我们的测试环境。

version: '3'
services:
  db:
    image: postgres:11
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: api_test
  app:
    build: .
    command: python manage.py test --noinput --keepdb
    volumes:
      - .:/app
    depends_on:
      - db

该文件与docker-compose.yml文件相似,但有一个关键区别:command。在这里,我们使用python manage.py test命令来运行Django测试。我们还使用了--noinput--keepdb来自动运行测试并保持数据库,这对于快速执行测试非常有用。

现在,我们可以使用以下命令来运行我们的测试:

$ docker-compose -f test.yml up --abort-on-container-exit

以上数据库均是使用docker-compose部署运行的

结论

在本教程中,我们介绍了如何使用Python Django和DRF以及Docker来构建测试驱动的Web API。通过将应用程序打包在容器中,可以提高应用程序的可移植性和可重复性,并确保应用程序在不同的系统上的可靠性。构建Web API时,测试驱动的方法可以帮助我们确保我们的代码质量,并减少错误的可能性。

写下了保证其可执行性,但由于是需要相关环境的长度很长.