一个非专业的工程师通过Docker开始接触Django REST Framework和React系列技术之一:Django的引入

前提条件 tí

    • EC2ServerのOS: AmazonLinux2

 

    • docker導入済み

 

    docker-compose導入済み

首先

react_django.png

此外,关于Django的介绍,这次我们会不详细地叙述。我过去曾使用docker-compose来实现了DjangoGirls博客的例子,并将其经过记录在Qiita上进行了投稿。我希望您在阅读本篇文章之前,请务必参考一下那篇投稿。

Django REST Framework指的是什么?

基于Django的框架,可实现RESTful API的实施。https://www.django-rest-framework.org/总之,它非常容易引入,通常被广泛采用作为REST API服务器的解决方案。

使用Django

首先在PublicSubnet上的EC2上创建一个用于后端的目录,并在该目录下创建以下三个文件。

backend
∟Dockerfile
∟docker-compose.yaml
∟requirements.txt
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install -r requirements.txt
ADD . /code/
version: '3'
services:
  db:
    image: postgres
    ports:
      - "5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  django:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
Django>=2.0,<3.0
psycopg2>=2.7,<3.0
djangorestframework==3.8.2
django-cors-headers==2.4.0

与DjangoGirls博客的先前示例不同之处在于在requirements.txt中添加了djangorestframework和django-cors-headers。
djangorestframework在本次中起主要作用。
而django-cors-headers是为了接收从S3重定向传输的访问而需要进行CORS设置。

如果能做到这一点,可以使用docker-compose创建项目。
docker-compose命令由于使用了Volumes,所以必须以Root用户身份运行才能正常工作。
这是一个Linux特定的问题,因为Docker容器内的uid/gid与主机不同,会导致PermissionError错误。
虽然也有其他解决方案,但由于本次只是验证,接下来的命令将继续以Root用户进行。

sudo su -
docker-compose run django django-admin.py startproject todo_project .

执行上述命令后的目录状态如下:

backend
∟Dockerfile
∟docker-compose.yaml
∟requirements.txt
∟manage.py
∟todo_project
 ∟__init__.py
 ∟settings.py
 ∟urls.py
 ∟wsgi.py

如果您在一般用户权限下创建了其他文件,请顺便将所有权限更改为Root。

sudo chown -R $USER:$USER .

为了进行数据库连接和其他配置,需要修改settings.py文件的以下两处位置。

cd todo_project
vi settings.py
ALLOWED_HOSTS = ["*"]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

创建应用程序。
如果Docker正在运行并且尚有残留,请首先全部删除。

docker-compose run django python manage.py startapp todos

执行完上述命令后的目录状态如下所示。

backend
∟Dockerfile
∟docker-compose.yaml
∟requirements.txt
∟manage.py
∟todo_project
 ∟__init__.py
 ∟settings.py
 ∟urls.py
 ∟wsgi.py
∟todos
 ∟admin.py
 ∟apps.py
 ∟__init__.py
 ∟migrations
  ∟__init__.py
 ∟models.py
 ∟tests.py
 ∟views.py

将已经创建的应用程序注册到settings.py中。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'todos',
]

创建一个模型。
这次我们打算创建一个非常简单的模型,仅包含标题和内容这两个属性,用于一个待办事项应用。

from django.db import models

# Create your models here.
class Todo(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()

    def __str__(self):
        return self.title

使用创建的模型进行迁移的操作。

docker-compose run django python manage.py makemigrations todos

创建了模型,因此需要修正admin.py文件。

from django.contrib import admin
from .models import Todo

admin.site.register(Todo)

为了能够在Docker启动时使用一行命令执行createsuperuser,需要添加自定义命令。

cd todos
mkdir -p management/commands
touch management/__init__.py
touch management/commands/__init__.py
vi management/commands/createcustomsuperuser.py
from django.contrib.auth.management.commands import createsuperuser
from django.core.management import CommandError

class Command(createsuperuser.Command):
    help = 'Crate a superuser, and allow password to be provided'

    def add_arguments(self, parser):
        super().add_arguments(parser)
        parser.add_argument(
            '--password', dest='password', default=None,
            help='Specifies the password for the superuser.',
        )

    def handle(self, *args, **options):
        password = options.get('password')
        username = options.get('username')
        database = options.get('database')

        if password and not username:
            raise CommandError("--username is required if specifying --password")

        super().handle(*args, **options)

        if password:
            user = self.UserModel._default_manager.db_manager(database).get(username=username)
            user.set_password(password)
            user.save()

将docker-compose命令更改为在启动时执行migrate和createsuperuser操作。

    command: sh -c "sleep 5; python manage.py migrate; python manage.py createcustomsuperuser --username root --password 123456 --noinput --email 'blank@email.com'; python manage.py runserver 0.0.0.0:8000"

由于至此为止,基本的Django配置已完成,因此接下来将开始进行用于提供RESTful API的配置。

素人基础工程师通过Docker研究Django REST Framework和react系列之二:继续探索Django REST Framework