Djangoプロジェクトの初期設定についてのマイルール覚書。
そろそろ、Djangoプロジェクトを作るのにも慣れてきたので、フォルダ構成や立ち上げ時にやることをまとめていく。適宜追加、修正
どこに何を入れておくかなどもまとめる。
Djangoプロジェクトの立ち上げ
フォルダ作成。そこに仮想環境を立ち上げる。仮想環境にDjangoをインストールする。venvフォルダはmyvenvとする。
mkdir xxx
cd xxx
python -m venv myvenv
myvenv\Scripts\activate
pip install django
プロジェクトは.を付けてそのディレクトリに入れる。プロジェクト名はprojectにする。
django-admin startproject project .
Settings.pyの設定
local_settings.pyを作成。個人用の設定はすべてこちら側に書く。
from .settings import *
DEBUG = True
ALLOWED_HOSTS = ['*']
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
ひとまずはこれだけ。
Settings.pyの方を本番用の環境に合わせて書き直す。
DEBUG = False
ALLOWED_HOSTS = ['domein.com'] #本番のドメイン
TEMPLATES = [
#TopのTemplatesフォルダを有効化
'DIRS': [os.path.join(BASE_DIR, "templates")],
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
STATIC_ROOT = '/usr/share/nginx/html/static' #honban
MEDIA_URL = '/media/'
MEDIA_ROOT = '/usr/share/nginx/html/media' #honban
大体こんなところかな。静的ファイルはnginxのパスにしておく。
django-environの導入。環境変数として読み込ませるため。
python -m pip install --upgrade pip
.envファイルをmanage.pyと同じ階層に保存。なおバージョン管理外にしておく。Setting.pyでimport
import environ
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = env('SECRET_KEY')
envには元のセキュリティキーを用意しておく。
SECRET_KEY=xxxxxxx
フォルダの作成
media
static
static/common/ #共通のヘッダ画像とか。
templates
templates/common/
それぞれ作っておく。
起動
python manage.py runserver --settings project.local_settings
ユーザー関係アプリ
python manage.py startapp accounts
accountsという名前で作成。
カスタムユーザーモデルを採用する。AbstractUserかAbstractBaseUserかはまだいまいち使い勝手が分かってないのでしばらく様子見。
使用するユーザーモデルをsettings.pyに追加。
AUTH_USER_MODEL = 'accounts.CustomUser'
なお、マイグレーションするまでにカスタムユーザーを作っておくこと。
スーパーユーザーの作成
python manage.py createsuperuser
運営用アプリ
python manage.py startapp information
informationという名前で作成。
お知らせ、Topページ、Help、企画などをここに突っ込む。
共通テンプレート
base.htmlという名前で作成
{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<meta content="" name="description">
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- OGP settings -->
<meta property="og:title" content="" />
<meta property="og:type" content="website" />
<meta property="og:description" content="" />
<!-- <meta property="og:image" content="https://{{ request.get_host }}{% static 'ogp.png' %}"/>-->
<meta property="og:url" content="{{ request.build_absolute_uri }}" />
<meta property="og:site_name" content="" />
<!-- <meta name="twitter:card" content="summary_large_image" /> -->
<meta name="twitter:site" content="" />
<!--<link rel="stylesheet" href="{% static 'common/base.css' %}">-->
<link rel="icon" type="image/png" href="{% static 'common/favicon.png' %}">
{% block header %}{% endblock %}
</head>
<body class="base-body">
<header class="base-header"></header>
<main class="base-content">{% block content %}{% endblock %}</main>
<nav class="base-nav"></nav>
<footer class="base-footer">©</footer>
{% block script %}{% endblock %}
</body>
</html>
URL取得
テンプレート上でURLを取得したいとき
{{ request.get_host }} ドメイン
{{ request.path }} パラメータなしパス
{{ request.get_full_path }} パラメータありパス
{{ request.build_absolute_uri }} パラメータありURL
PWA化
path('sw.js', (TemplateView.as_view(template_name="sw.js",content_type='application/javascript', )), name='sw.js'),
sw.jsを上位ディレクトリにするためにurls.pyにテンプレートから取得するようにする。
template/sw.jsを作成。
// Cache name
const CACHE_NAME = 'pwa-caches-v1';
// Cache targets
const urlsToCache = [
'static/common/favicon.png',
];
self.addEventListener('install', (event) => {
event.waitUntil(
caches
.open(CACHE_NAME)
.then((cache) => {
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches
.match(event.request)
.then((response) => {
return response ? response : fetch(event.request);
})
);
});
Cache targetsにキャッシュさせたいファイルを作成しておく。
common/manifest.jsonを作成
{
"name": "",
"short_name": "",
"start_url": "../../",
"display": "minimal-ui",
"background_color": "#fff",
"theme_color": "#fff",
"Scope": "../../",
"description": "",
"icons": [
{
"src": "icon192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icon512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
名前など入力する。
base.htmlにマニュフェストファイルを読み込ませる。
<link rel="manifest" href="{% static 'common/manifest.json' %}">
ページネーション
common/page_nation.htmlで作成.
403, 404, 405, 500
templates/に403.html,404.html, 405.html, 500.htmlを作成する。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>404</title>
<meta name="robots" content="noindex">
<meta name="viewport" content="width=device-width,initial-scale=1">
</head>
<body>
<h1>このページはありません!</h1>
<p>アクセスできないURLか、ページが削除されています。</p>
<p>もしくは、URLの打ち間違い、リンクミスの可能性があります。確認してみてください。</p>
<p><a href="/">トップページに戻る</a></p>
</body>
</html>
noteの404美術館みたいな感じもいいと思う。余裕があれば考えたい。
良ければサポートお願いします。サポート費用はサーバー維持などの開発費に使わせていただきます。