Django の app をパッケージ化する

  • やりたいこと

    • Django のアプリをパッケージにしたい。
    • マイグレーションと API をインストールできるようにしたい。
    • GitHub から pip でインストールしたい。
  • なんでやりたいのか

    • ほかの企画でも使いまわせる app が必要になったので。

参考

とりあえず urls views models を作成する

とりあえずパッケージ化するアプリを作ります。
Django で myapp を作成して以下のようなファイルを作ります。
単純にデータを取ってきて JSON を返す API です。

urls.py

from django.urls import path
from . import views

app_name = "myapp"
urlpatterns = [
    path("index/", views.index, name="index"),
]

views.py

import json
from .models import MyModel
from django.http import HttpResponse

def index(request):
    mymodel = MyModel.objects.get(id=1)
    datas = {"data": mymodel.mydata}
    return HttpResponse(json.dumps(datas, ensure_ascii=False))

models.py

from django.db import models

class MyModel(models.Model):
    mydata = models.CharField(max_length=100, null=True)

API の結果

{
  "data": "mydata"
}

パッケージ化する

パッケージ名を mypackage としています。

mkdir mypackage
mv myapp mypackage/.
touch README.md
touch LICENSE
touch pyproject.toml

階層は以下の通りです。

mypackage
├── LICENSE
├── README.md
├── myapp
└── pyproject.toml

ファイルの中身を作る

README.md

公式のアプリ名を変えただけです。
今度ちゃんと書き直したいです。

=====
MyApp
=====

MyApp is a Django app to conduct web-based myapp. For each question,
visitors can choose between a fixed number of answers.

Detailed documentation is in the "docs" directory.

Quick start
-----------

1. Add "myapp" to your INSTALLED_APPS setting like this::

    INSTALLED_APPS = [
        ...
        'myapp',
    ]

2. Include the myapp URLconf in your project urls.py like this::

    path('myapp/', include('myapp.urls')),

3. Run ``python manage.py migrate`` to create the myapp models.

4. Start the development server and visit http://127.0.0.1:8000/admin/
   to create a poll (you'll need the Admin app enabled).

5. Visit http://127.0.0.1:8000/myapp/ to participate in the poll.

LICENSE

ライセンスは参考にしてなるようです。
中身は記載しなくても大丈夫でしたが、ファイル自体を作成しなかったら GitHub から直接インストールするときに怒られてしまいました。

pyproject.toml

インストールする為の設定を記載していくファイルのようです。
後日設定をまとめたいです。。。

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build]
include = [
    "myapp/*",
    "myapp/static",
    "myapp/templates",
    "docs",
]

[project]
name = "mypackage"
version = "0.1"
authors = [
    { name="your name", email="mail@example.com" },
]
description = "A Django app to conduct web-based myapp."
readme = "README.md"
license = {file = "LICENSE"}
requires-python = ">=3.6.9"
dependencies =  [
    "django >= 3.4",
]
classifiers =  [
    "Environment :: Web Environment",
    "Framework :: Django",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3",
]

ビルドする

以下のコマンドでビルドします。

pip install build
python -m build

成功すると dist が出来ます。

mypackage
├── LICENSE
├── README.md
├── dist
│   ├── mypackage-0.1-py3-none-any.whl
│   └── mypackage-0.1.tar.gz
├── myapp
└── pyproject.toml

インストール & Django で動かす

Django のプロジェクトを新しく作り直してパッケージをインストールしていきます。
早速インストールしてパッケージを確認します。

pip install mypackage/dist/mypackage-0.1.tar.gz
pip freeze | grep mypackage
mypackage @ file:///project/backend/mypackage/dist/mypackage-0.1.tar.gz#sha256=2dfaad48fffdvf85c84a8e6e209b2400d52dbdfd512ca24e7eb861833e81157f

無事マイグレーションが読みこまれているのを確認する。

 python manage.py showmigrations
 ...
 myapp
 [ ] 0001_initial
 ...

あとは README の通りに進めるようです。

settings.py

INSTALLED_APPS = [
    ... 略 ...
    'myapp', # 追加する。
]

urls.py

path('myapp/', include('myapp.urls')), # 追加する。

確認する

MyModel の id==1 の mydata に hogehoge を設定し API をたたく。
無事レスポンスが返って来ました。

http://localhost:8000/myapp/index/
{
  "data": "hogehoge"
}

GitHub からインストール

gitinit でパッケージ内に .git を作成し以下を push します。
構成は以下の通りです。

mypackage
├── .git
├── LICENSE
├── README.md
├── dist
│   ├── mypackage-0.1-py3-none-any.whl
│   └── mypackage-0.1.tar.gz
├── myapp
└── pyproject.toml

後は以下のコマンドを実行すればインストールされています。

pip install git+https://github.com/username/reponame.git