Djangoでログイン処理

この記事の通りにやるのが、最も簡単に実装できそうでした。実際に動きました。
qiita.com

さて、最後の方だけつまづきやすいです。

関数だったら手前に
@login_required

クラスだったら手前に、
@method_decorator(login_required, name='dispatch')
です。

djangoで色々作ってみます!

django+elastic beanstalkの設定は、前回までやってみました。前回はコチラ↓↓↓
serverless.hateblo.jp

その続きで、今回はdjangoでアプリを作ってみます!

さて、この記事で参考にするのは、このサイトの(3)以降です。
qiita.com


≪作業≫
(1)SQLITEを作る
マイグレーションやってみます。

C:\python\env0001\ebdjango>..\Scripts\activate

(env0001) C:\python\env0001\ebdjango>python manage.py migrate
Operations to perform:
  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 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

次に、スーパーユーザーを作ります。

(env0001) C:\python\env0001\ebdjango>python manage.py createsuperuser
Username (leave blank to use 'wataru'): admin
Email address: admin@example.com
Password:
Password (again):
Superuser created successfully.

(2)新規アプリを作る

(env0001) C:\python\env0001\ebdjango>python manage.py startapp cms

こんな感じのフォルダ構成になります。

ebdjango/
    cms/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py
    manage.py
    ebdjango/
       :
       :

(3)モデルを作る
説明通りにやってみました。2行あけるとか、改行で終わるとか、注意点がありますね。

モデルの作成
データベースに定義したいデータ モデルを、cms/models.py に定義します。

classの前は、2行開けないと、波線が出て警告されます。pep8というコードスタイルチェックの仕組みです。
同様に、コードの最後が改行のみで終わっていないと、また波線が出て怒られるので、気をつけましょう。

とのことです。
チュートリアル通りのモデルを作ってみました。

from django.db import models


class Book(models.Model):
    """書籍"""
    name = models.CharField('書籍名', max_length=255)
    publisher = models.CharField('出版社', max_length=255, blank=True)
    page = models.IntegerField('ページ数', blank=True, default=0)

    def __str__(self):
        return self.name


class Impression(models.Model):
    """感想"""
    book = models.ForeignKey(Book, verbose_name='書籍', related_name='impressions', on_delete=models.CASCADE)
    comment = models.TextField('コメント', blank=True)

    def __str__(self):
        return self.comment

さぁ、モデルを有効にしましょう。
有効にするには、settings.pyにアプリの名前を登録してあげれば良いと思います。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'cms',
]

マイグレーションファイルを作ります。

(env0001) C:\python\env0001\ebdjango>python manage.py makemigrations cms
Migrations for 'cms':
  cms\migrations\0001_initial.py
    - Create model Book
    - Create model Impression

0001_initial.pyというマイグレーションファイルができていると思います。

そしたら、マイグレーションファイルを反映します。

(env0001) C:\python\env0001\ebdjango> python manage.py migrate cms
Operations to perform:
  Apply all migrations: cms
Running migrations:
  Applying cms.0001_initial... OK

ここまでをまとめると、モデルを作成/変更するためには、次の3ステップが必要なんです。
model.pyを変更 → マイグレーションファイルを作る → マイグレーションファイルを反映するの3ステップです。

elastic beanstalk上にdjangoを構築する

前回、途中で脱落してしまったのだが、、、今度こそ!
serverless.hateblo.jp

今回は、AWS公式のチュートリアルに、そのまま沿ってやってみます!
これ以外のことは、やらないぞ。
Elastic Beanstalk への Django アプリケーションのデプロイ - AWS Elastic Beanstalk

前回はフォルダ構成を間違えていたかなぁ。
このstackoverflowを見ながら、再度トライしてみたい。
stackoverflow.com

./ebdjango
↓
.
├── .ebextensions
│   └── python.config
├── .elasticbeanstalk
│   ├── config
├── .git
├── .gitignore
├── manage.py
├── ebdjango
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── requirements.txt

(1) python3.6をインストール
最新は3.7なんですが、AWS EBとの相性を考えて。
3.7はアンインストールして、3.6を入れました。
www.python.org

Python 3.6.6 - 2018-06-27
Windows x86-64 executable installer
インストール時は、”Add”Python3.6 to Path"のチェックオンも忘れずに。


(2) virtualenvをインストール

C:\python>pip install virtualenv

(3) AWS ebcliをインストール

pip install awsebcli --upgrade --user

path"Python 3.6 – %USERPROFILE%\AppData\Roaming\Python\Python36\Script"も設定の事
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html

(4) virtualenvで環境を作る

C:\python>cd env0001

少し待ちます。

当該フォルダに移動してから、アクティベートしましょう。

C:\python>cd env0001
C:\python\env0001>Scripts\activate

(5)djangoを仮想環境にインストールする

(env0001) C:\python\env0001>pip install django==2.0

python3.6に対応しているのがdjango2.0だったような気がするので、このようにバージョンを指定しました。

(6)ローカルにプロジェクトを作る

(env0001) C:\python\env0001>django-admin startproject ebdjango

(7)まずはローカルで動かす

(env0001) C:\python\env0001>cd ebdjango

(env0001) C:\python\env0001\ebdjango>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 15, 2018 - 15:33:45
Django version 2.0, using settings 'ebdjango.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[15/Jul/2018 15:33:49] "GET / HTTP/1.1" 200 16559
[15/Jul/2018 15:33:49] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[15/Jul/2018 15:33:50] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 81348
[15/Jul/2018 15:33:50] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 80304
[15/Jul/2018 15:33:50] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 82564
Not Found: /favicon.ico
[15/Jul/2018 15:33:50] "GET /favicon.ico HTTP/1.1" 404 1974

(8) (CLIで初アクセスの場合)AWSのアクセスキーを払い出す
docs.aws.amazon.com
忘れないように、アクセスキーはどこかに記録しておきましょう。

(9) Elastic Beanstalk用の設定
さて、この開始位置のフォルダが重要です。仮想環境ではなく、プロジェクトフォルダの直下から始めましょう。
この例では、ebdjangoの直下です。

(env0001) C:\python\env0001>cd ebdjango
(env0001) C:\python\env0001\ebdjango>pip freeze > requirements.txt
(env0001) C:\python\env0001\ebdjango>mkdir .ebextensions

.ebextensions ディレクトリ内に、次のテキストを持つ django.config という名前の設定ファイルを追加します。

例 ~/ebdjango/.ebextensions/django.config

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango/wsgi.py

ここで、仮想環境から出ます。

(env0001) C:\python\env0001\ebdjango>..\Scripts\deactivate

まだ、フォルダの位置はプロジェクト"ebdjango"の直下ですよ。


(10) ebcli(elastic beanstalk command line interface)でサイトをデプロイする

C:\python\env0001\ebdjango>eb init -p python-3.6 ebdjango

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
(default is 3): 9
Application ebdjango has been created.

チュートリアルではオプションと書いてある"eb init"は実行せずに、次に行きます。

C:\python\env0001\ebdjango>eb create django-env

ここで数分を待つ。

環境の作成プロセスが完了したら、eb status を実行して新しい環境のドメイン名を見つけます。

~/ebdjango$ eb status

と、入力すると、、、

Environment details for: django-env
Application name: django-tutorial
...
CNAME: eb-django-app-dev.elasticbeanstalk.com

これが、欲しい文字列です。


ebdjango ディレクトリ内の settings.py ファイルを編集し、ALLOWED_HOSTS 設定を見つけ、先のCNAMEのプロパティ値を追加します。

...
ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']

ここで、デプロイします。

C:\python\env0001\ebdjango>eb deploy

最後に、eb openでブラウザが立ち上がります。

C:\python\env0001\ebdjango>eb open

f:id:urbanplanner:20180715160756p:plain
図:django画面

動いた~★

ここまでできて、良かったです。

さて、チュートリアルは、まだまだ続きます。

(11) 設定を変更する。
TIME_ZONE の settings.py 設定を変更する

例 ~/ebdjango/ebdjango/settings.py

...
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

そして、デプロイします。

C:\python\env0001\ebdjango>eb deploy

さら、ここから様々djangoアプリを作ってみますが、続きは、コチラにて。
serverless.hateblo.jp

(注意を追記
CSSを使っている場合は、以下の処理が必要です。
チュートリアルに書いてあるのですが、見落としやすいですね。

まず、settings.pyへの追記

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = 'static'

そして、静的アセットの追加。

(env0002) C:\python\env0002\ebdjango>python manage.py collectstatic