使用Docker上的Django REST Framework快速创建Hello World API

首先

使用Django REST Framework(DRF)在Docker容器中创建一个简单的Hello World API。
为了不弄脏本地环境,我打算在容器中进行编码。
这是一个可以随时重做的轻松开发环境的想法。

Django REST框架是什么?

使用Python的Web应用程序框架Django来开发API的库。如果能够灵活运用,可以轻松快速地开发RESTful API(非常重要)。

    公式ドキュメント:Django REST Framework

环境

    • Windows 10 Pro(20H2)

 

    • Docker Desktop:3.1.0(51484)

 

    VSCode:1.53.2

0. 准备(如果需要的话)

remote.png

1. Docker镜像构建

Django
djangorestframework
FROM centos

RUN yum -y groupinstall "development tools" \
&& yum -y install \
           wget \
           zlib-devel \
           openssl \
           openssl-devel \
           sqlite \
           sqlite-devel \
&& cd /opt \
&& wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz \
&& tar xzvf Python-3.9.2.tgz \
&& cd ./Python-3.9.2 \
&& ./configure --with-threads && make install && make clean \
&& rm -rf /opt/Python-3.9.2.tgz \
&& ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

COPY ./requrements.txt /opt/
RUN pip3 install --no-cache-dir -r /opt/requrements.txt

在同一層级上放置两个项目,并在该目录中构建Docker镜像。

PS C:\Users\sakimura\Documents\Programs> docker build . -t django_hello
[+] Building 1.1s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 644B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                   0.0s
 => [1/5] FROM docker.io/library/centos                                                                            0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 70B                                                                                   0.0s
 => CACHED [2/5] RUN yum -y groupinstall "development tools"                                                       0.0s
 => CACHED [3/5] RUN yum -y install            wget            zlib-devel            openssl            openssl-d  0.0s
 => [4/5] COPY ./requirements.txt /opt/                                                                            0.0s
 => ERROR [5/5] RUN pip3 install --no-cache-dir -r /opt/requrements.txt                                            0.9s
------
 > [5/5] RUN pip3 install --no-cache-dir -r /opt/requrements.txt:
#9 0.637 ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/opt/requrements.txt'
#9 0.843 WARNING: You are using pip version 20.2.3; however, version 21.0.1 is available.
#9 0.843 You should consider upgrading via the '/usr/local/bin/python3.9 -m pip install --upgrade pip' command.
------
executor failed running [/bin/sh -c pip3 install --no-cache-dir -r /opt/requrements.txt]: exit code: 1
PS C:\Users\sakimura\Documents\Programs> docker build . -t django_hello
[+] Building 13.0s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 645B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                   0.0s
 => [1/5] FROM docker.io/library/centos                                                                            0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 37B                                                                                   0.0s
 => CACHED [2/5] RUN yum -y groupinstall "development tools"                                                       0.0s
 => CACHED [3/5] RUN yum -y install            wget            zlib-devel            openssl            openssl-d  0.0s
 => CACHED [4/5] COPY ./requirements.txt /opt/                                                                     0.0s
 => [5/5] RUN pip3 install --no-cache-dir -r /opt/requirements.txt                                                12.1s
 => exporting to image                                                                                             0.8s
 => => exporting layers                                                                                            0.8s
 => => writing image sha256:adc1814ea2869e74515c44a91d91bb408c5af97a9d68309eea1368b3c0222130                       0.0s
 => => naming to docker.io/library/django_hello                                                                    0.0s

在代理环境下,有可能需要使用 –build-arg http_proxy/https_proxy。

    参考記事:プロキシ環境下でdocker image buildしたい

2. Docker容器启动

使用构建的映像启动容器。
这次将容器的8000号端口映射到主机的8090号。

PS C:\Users\sakimura\Documents\Programs> docker run -itd -p 8090:8000 --name django_hello django_hello
069eb3777790f092bcd8825ce2b3352f939876e17ddb06e85d85775c6baa3cfd
PS C:\Users\sakimura\Documents\Programs> docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                    NAMES
e81d8fcebd80   django_hello   "/bin/bash"   49 seconds ago   Up 49 seconds   0.0.0.0:8090->8000/tcp   django_hello

3. 制作API

キャプチャ.PNG
container.png

在VSCode中,使用Ctrl + Shift + @快捷键打开终端,在/opt路径下创建Django项目后,进入项目目录并创建Django应用。

[root@e81d8fcebd80 opt]# pwd
/opt
[root@e81d8fcebd80 opt]# django-admin startproject sampleproject
[root@e81d8fcebd80 opt]# cd sampleproject
[root@e81d8fcebd80 sampleproject]# django-admin startapp hello 

请分别编辑项目目录中的Django配置文件和URL调度器。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', # 追加
]
"""sampleproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.conf.urls import include, url # 追加
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^hello', include('hello.urls', namespace='hello')), # 追加
]

在创建新的应用程序目录URL调度程序的同时,编辑views.py文件。

from django.urls import path
from . import views

app_name = 'hello'
urlpatterns = [
    path('', views.hello_world),
]
from rest_framework.response import Response
from rest_framework.decorators import api_view

@api_view(['GET'])
def hello_world(request):
    return Response({"message": "Hello, world!"})

4. API启动 (API

由于准备工作已经完成,现在在终端上执行以下命令,启动Django内置服务器。

[root@e81d8fcebd80 sampleproject]# python3 /opt/sampleproject/manage.py runserver 0.0.0.0:8000

5. 验证操作

200.png
rawJSON.png

总结

辛苦了。
利用Django REST Framework,我们能够相当快速地实现API。
包括CRUD在内的RESTful-API的实现以及考虑到生产环境的Web/WSGI服务器的引入将在另一篇文章中进行描述。

请提供参考的网址。

    • Django REST Frameworkを使って爆速でAPIを実装する

 

    • Django REST Framework の使い方メモ

 

    [Django REST Framework] View の使い方をまとめてみた
广告
将在 10 秒后关闭
bannerAds