一个非专业的工程师通过Docker开始接触Django REST Framework和React系列技术之一:Django的引入
前提条件 tí
-
- EC2ServerのOS: AmazonLinux2
-
- docker導入済み
- docker-compose導入済み
首先
此外,关于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