Django 認証機能を追加してみる その１

#背景
Djangoに認証機能を付けたくなったので、ネットで検索してみるもののわかりやすい記事が見つかりませんでした。
しかし　[Django2 でユーザー認証（ログイン認証）を実装するチュートリアル -1- 環境構築とアプリ雛形の作成](https://it-engineer-lab.com/archives/506)　という記事が一番わかりやすそうだったので参考にさせて頂きましたが、細かいところでいまく行きませんでしたので、私の環境でうまく行った手順を書いておこうと思い立ちました。

#動作環境
CentOS Linux release 7.5.1804 (Core)
mysql  Ver 8.0.12
$ python3 -V
Python 3.6.5
django.VERSION　(2, 1, 1, 'final', 0)

#とりあえずDjangoのプロジェクトとアプリを作ってみる

~~~
$ mkdir login  適当なディレクトリを作成
$ cd login
$python3 -m venv myvenv　　　仮想環境構築
$ ls
myvenv
$ tree -L 1 myvenv
myvenv
---   bin
--- include
--- lib
---- lib64 -> lib
---- pyvenv.cfg
~~~
仮想環境にDjangoをインストールして、プロジェクトを作成します。

~~~
$ bin/pip3 install django==1.8
$ ls
bin  include  lib  lib64  pip-selfcheck.json  pyvenv.cfg
$ ls bin
__pycache__  activate.csh   django-admin     easy_install      pip   pip3.6  python3
activate     activate.fish  django-admin.py  easy_install-3.6  pip3  python
$django-admin startproject myapp .

$django-admin startproject myapp .  プロジェクトを作成します。
$ ls
bin  include  lib  lib64  manage.py  myapp  pip-selfcheck.json  pyvenv.cfg
~~~

setting.pyを編集します。

~~~
$vi myapp/settings.py
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
USE_TZ = False  # DefaultではUTCのタイムゾーンのため False に変更

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  <--MySqlを使う設定
        'NAME': 'test',　　　データベースは事前に作っておく
        'USER': 'root',
        'PASSWORD': '*********',
        'HOST': '127.0.0.1',
    }
}
~~~
manage.pyにmysqlの設定をする。

~~~
$vi manage.py
#!/usr/bin/env python
import os
import sys
import datetime
import pymysql　　　　　　　　　<--追加
pymysql.install_as_MySQLdb()　<--追加
~~~

データベースをmigrateします。

~~~
$python3 manage.py migrate
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
~~~

blogアプリを作成して、setting.pyに登録します。

~~~
$python3 manage.py startapp blog
$vi myapp/settings.py
# Application definition
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
)
~~~

blogのモデルを作成します。blog/models.py

~~~
from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

~~~
データベースのマイグレーションを実行します。

~~~
$ python3 manage.py makemigrations blog

$ python3 manage.py migrate blog
~~~
管理サイトのアカウントを事前に作ります。

~~~
$ python manage.py createsuperuser
Username (leave blank to use 'your_name'): admin
Email address: email@example.com # メールアドレスを個別に設定
Password: # パスワードを入力
Password (again): # パスワードをもう一度
Superuser created successfully.
~~~
urls.pyを設定します。

~~~
$vi myapp/urls.py
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'', include('blog.urls')),
]
$vi blog/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.post_list),
]
~~~

blog/views.pyを作成します、

~~~
$vi views.py
from django.shortcuts import render

def post_list(request):
    return render(request, 'blog/post_list.html', {})
~~~
HTMLファイルを作成します。/blog/templates/blog/post_list.html
ディレクトリが深いので注意!

~~~
<html>
    <p>こんにちは</p>
    <p>動いています！！</p>
</html>
~~~


サーバーを起動します。

~~~
$ python3 manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
May 27, 2020 - 13:51:11
Django version 2.1.1, using settings 'myapp.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
~~~
http://127.0.0.1:8000/にアクセスすると、以下が表示されます。

![hello.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26218/5e3b6178-f3e7-2d4c-2410-8857cd3d8679.jpeg)

http://127.0.0.1:8000/admin にアクセスして、さきほど作成したid,passwordでloginします。
![kanrisite.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26218/bd690263-0b3d-a859-ee8d-377adb86ed18.jpeg)
以下の画面が出ればOKです。
![kanrisite2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26218/f83a776a-ea0e-7879-f324-d0f71f052c8f.jpeg)

だいぶ長くなりましたが、ここまでできると、認証機能を追加する準備完了です。
続きは、[Django 認証機能を追加してみる その２](https://qiita.com/teijinakano/items/de0de09aa31424e81889)

#参考
[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（１）【環境構築編】](https://qiita.com/yoshizaki_kkgk/items/f3c79e38b802c7fc8863)
[Django2 でユーザー認証（ログイン認証）を実装するチュートリアル -1- 環境構築とアプリ雛形の作成](https://it-engineer-lab.com/archives/506)