search
LoginSignup
0

posted at

updated at

djangoを使ったAPI開発を理解する[part1 目的の整理と環境構築]

諸事情でDjango-rest-frameworkを使えるようになることになったため、その過程を残していきます。

タイトルに目的の整理と環境構築としていますが、先に環境構築の内容を書きます。
目的の整理は気になったらこの記事の後半部分の前提項を見てください。

環境構築

作業する環境

今回の記事を書くにあたり使用した環境はこちら

okapi@MBP01 ~ % sw_vers
ProductName:	macOS
ProductVersion:	12.3.1
BuildVersion:	21E258

okapi$ docker --version
Docker version 20.10.5, build 55c4c88

okapi$ docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f

今回はdocker-composeを利用して端末上のpythonは利用しない方針で進めます。

元にするdocker-compose.ymlの作成

まずはdocker-compose.ymlを作成します。
(今回はsqlite3を使用するので管理するコンテナは1つだけですが、dbコンテナを将来的に追加する想定です)

docker-compose.yml
version: '3'

services:
  web:
    build: ./web
    volumes:
      - ./web/code:/code
    ports:
      - "8000:8000"
    tty: true

これに合わせてdockerfileを書きます。

./web/dockerfile
FROM python:3
RUN mkdir /code
WORKDIR /code

これで出来上がるのはpython3系のコンテナが1個だけです。
djangoのオフィシャルイメージもあるのですが、最終更新が5年前なのでこれは使わず作ります。

django関係の準備

ここからはdjangoのチュートリアルも参考にしながら進めていきます。
まず、準備したコンテナをbuild、upしていきます。
起動したコンテナの中でこの先は操作していきます。

okapi$ docker-compose build
-中略-
okapi$ docker-compose up -d
okapi$ docker-compose exec web bash

まずはインストールから
djangoオフィシャルdjango-rest-frameworkオフィシャルで紹介されている手順でインストール、動作をまずは確認します。

root@a4f1172d6665:/code# pip install django
root@a4f1172d6665:/code# python
>>> import django
>>> print(django.get_version())
4.0
root@a4f1172d6665:/code# pip install djangorestframework
root@a4f1172d6665:/code# pip install django-filter

と、やるとインストールはできるのですが、このままだとコンテナを立て直したりするとまっさらな状態になってしまいます。
それを防ぐためにpipではrequirements.txtに対象を記載しておくことができます。
その対応をします。

./web/reqirements.txt
django
djangorestframework
django-filter

作ったrequirements.txtを読み込みます。
これに合わせてdockerfileを書きます。

./web/dockerfile
FROM python:3
RUN mkdir /code
WORKDIR /code
+ COPY ./requirements.txt /code/
+ RUN pip install -r requirements.txt

この状態で再度ビルドしてみます。

okapi$ docker-compose down
okapi$ docker-compose up -d --build
okapi$ docker-compose exec web bash
root@a4f1172d6665:/code# pip list
Package             Version
------------------- -------
asgiref             3.5.1
Django              4.0.4
django-filter       21.1
djangorestframework 3.13.1
pip                 22.0.4
pytz                2022.1
setuptools          58.1.0
sqlparse            0.4.2
wheel               0.37.1

これで環境は整いました。
ここで終わってもいいのですが、djangoのプロジェクトを立ち上げて、WORKDIRの変更までしてあげましょう。

プロジェクトの立ち上げ

djangoにはプロジェクトとアプリケーションの概念があります。

プロジェクトとアプリケーション

What's the difference between a project and an app? An app is a web application that does something -- e.g., a blog system, a database of public records or a small poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects.

はじめての Django アプリ作成、その 1より

ここだけ訳されてなかったので意訳(英弱の理解です、ツッコミは受け付けます)

プロジェクトとアプリケーションの間の違いはなんでしょうか?アプリケーションはブログシステムや公的な記録のデータベース、小さな投票アプリのような何かしらを行うwebアプリケーションのことです。プロジェクトは定義のまとまりや、特定のwebサイトに向けたアプリケーションの集合です。一つのプロジェクトは複数のアプリケーションを持つことができます。アプリケーションは複数のプロジェクトに含まれることができます。

今回は環境構築の追加としてやるので、プロジェクトを1つ作ります。
その時は以下のようなコマンドを流します。

root@a4f1172d6665:/code# django-admin startproject <プロジェクト名>

今回はプロジェクトとして、テキストでのblogサービスのようなアプリケーションを実装します。
そのため、プロジェクト名はmyblogとしてコマンドを実行します。

root@a4f1172d6665:/code# django-admin startproject myblog

これを実行すると、myblogディレクトリ配下に必要なファイルが自動生成されます。
この生成されたところに、dockerfileWORKDIRを設定してこの先の開発を楽にします。

web/dockerfile
FROM python:3
RUN mkdir /code
WORKDIR /code
COPY ./requirements.txt /code/
RUN pip install -r requirements.txt
+ WORKDIR /code/myblog

今回は、パッケージ導入を行う都合でWORKDIR設定を2度を行います。
これでビルドし直してみます。

okapi$ docker-compose down
okapi$ docker-compose up -d --build
okapi$ docker-compose exec web bash
root@6f4ae531bd2c:/code/myblog# 

これで、生成されたディレクトリに直接移動できるようになりました。
ここまでで、環境設定は完了ですが一点注意事項が。
生成したプログラムにはシークレットキーがあります。

./web/code/myblog/myblog/local_settings.py

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = ''
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ここをコミット、プッシュすると音速で監視botからメールがきます。(きました)
なので、別管理する様にしましょう。
今回はlocal_settigns.pyを作ってそこに置いておく様にしました。
【Django】SECRET_KEYなどの機密情報を別ファイルで管理を参考に対応しました。
これで環境準備は完了です。

ここまでのソースはこちら

django-api-sample(v0.0.2、今回記事の範囲)
django-api-sampleリポジトリ

次のやること

次はアプリを作成して、createの機能を持たせるところまでを目指そうかなと思っています。
次回はこちら
djangoを利用したAPIを理解する[part2 アプリを作ってモデル周りの整備]

参考

前提

まず自分の現状とどこまでできるようになりたいかからです。

現状

  • python
    • 2系を使ってちょっとした開発はしたことがある
  • django
    • 名前は知ってる、使ったことはない
  • django-rest-framework
    • djangoと同じく使ったことない
  • その他
    • 他のフレームワーク(ruby on rails/nest.js)や言語(go)の経験は多少ある

目指すところ

  • APIの一連の実装を進められるようになる
    • CRUDいずれかの機能を持つAPI機能の実装テストコードの作成までを一連とする
  • DB繋いで使えるようにする
    • 今回の記事の中では一旦DBはsqlite3で一連を身につけつつ、最終的にmysqlのDBと繋いでいく
      こんなところを目指すための技術習得を進めます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0