2019年10月10日木曜日

Django クラウドAPI REST認証

1.全体ツリー構造

1-1 ファルダ
TTG_Project
├── README
├── client                      # クライアントテストツール
│   ├── __pycache__
│   ├── client.py
│   ├── data.py                 # テストデータ
│   └── run                     # クライアント起動 ($ ./run)
└── server                      # Django サーバアプリケーション
    ├── api                     # API ファルダー
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── models.py
    │   ├── registerAPI.py      # レジスタ用web API
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    ├── build                   # マイグレション/起動スクリプト
    ├── clean                   # キャシュクリヤー
    ├── conf
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── settings.py         # DB設定等、各種設定
    │   ├── urls.py
    │   └── wsgi.py             # apache 起動入り口
    ├── env
    └── manage.py               # 手動起動入り口


2.環境構築
2-1 pythonのインストール
2-2 Djangoのインストール
2-3 プロジェクトの作成

$ mkdir TTG_Project
$ cd TTG_Project
$ django-admin startproject conf
$ mv conf server
$ cd server
$ python36 manage.py startapp api

2-4 settings.pyの編集

$ vi ./conf/settings.py

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'api.apps.ApiConfig',             # 追記
  'rest_framework',                 # 追記
]

# 下記追記

from datetime import datetime, timedelta

REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': (
  ¦ 'rest_framework.permissions.IsAuthenticated',
  ),
  'DEFAULT_AUTHENTICATION_CLASSES': (
  ¦ 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
  ),
  'NON_FIELD_ERRORS_KEY': 'detail',
  'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}

JWT_AUTH = {
  'JWT_SECRET_KEY': SECRET_KEY,
  'JWT_ALGORITHM': 'HS256',
  'JWT_ALLOW_REFRESH': True,
  'JWT_EXPIRATION_DELTA': timedelta(days=7),
  'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=28),
}

# 下記ファイル作成を新規に作成
$ vi api/urls.py
from django.urls import path
from . import views
from rest_framework_jwt.views import obtain_jwt_token, verify_jwt_token, refresh_jwt_token

app_name = 'api'

urlpatterns = [
    path('token/', obtain_jwt_token),
    path('token/verify/', verify_jwt_token),
    path('token/refresh/', refresh_jwt_token),
    path('v1/register/', views.RegisterAPI.as_view()),
    path('v1/cxdnext/',  views.CxdnextAPI.as_view()),
]

2-5 conf/urls.pyの編集

$ vi conf/urls.py

from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls',   namespace='api')),    # 追記
]


3 デーベース

3-1 mysqlデータベース設定

$ vi conf/settings.py

import pymysql
pymysql.install_as_MySQLdb()

DATABASES = {
   'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'ttg',       # 予め空DBを作成しておく。
      'USER': 'admin',
      'PASSWORD':'password',
      'HOST': '',
      'PORT': '',
      'OPTIONS': {
            'charset': 'utf8mb4',
      },
      'ATOMIC_REQUESTS': True,
   },
   'db_ttg': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'ttg_data',   # 予め空DBを作成しておく。
      'USER': 'admin',
      'PASSWORD':'password',
      'HOST': '',
      'PORT': '',
      'OPTIONS': {
            'charset': 'utf8mb4',
      },
      'ATOMIC_REQUESTS': False,
   }
}

※  mysqlデータベースのインストール方法は省略します。

3-2 データベース構造
drop database ttg_data;
create database ttg_data;
use ttg_data;

create table  ttg_cart(
invoice        varchar(6)  not null comment "伝票コード",
state          varchar(2)  not null comment "ステータス 00:未処理 01:決済中 99:決済完了",
customerID     varchar(16) not null comment "顧客コード",
itemcode       varchar(16) not null comment "商品コード",
quantity       varchar(10) not null comment "数量",
lastupdate     varchar(14) not null comment "最終更新日時",
createtime     varchar(14) not null comment "登録日時");

3-3 サンプルデータ
insert into  ttg_cart
( invoice, state, customerID, itemcode, quantity, lastupdate, createtime ) values
('000001','00','0000000000000100','0000000000000200',3,'20191008164520','20191008164520'),
('000002','00','0000000000000100','0000000000000300',3,'20191008164520','20191008164520'),
('000003','00','0000000000000100','0000000000000400',3,'20191008164520','20191008164520'),
('000004','00','0000000000000100','0000000000000600',3,'20191008164520','20191008164520'),
('000005','00','0000000000000200','0000000000020100',4,'20191008174520','20191008164520'),
('000006','00','0000000000000200','0000000000020200',4,'20191008174520','20191008164520'),
('000007','00','0000000000000200','0000000000020100',4,'20191008174520','20191008164520'),
('000008','00','0000000000000300','0000000000030200',5,'20191008184520','20191008164520'),
('000009','00','0000000000000300','0000000000030300',5,'20191008184520','20191008164520'),
('000010','00','0000000000000300','0000000000030400',5,'20191008184520','20191008164520'),
('000011','00','0000000000000400','0000000000040100',6,'20191008194520','20191008164520'),
('000012','00','0000000000000400','0000000000040200',6,'20191008194520','20191008164520'),
('000013','00','0000000000000400','0000000000040300',6,'20191008194520','20191008164520');


4. 起動
4-1 起動前準備

1) キャシュクリア
$ vi clean
rm -f  api/migrations/000?_initial.py
rm -f  api/migrations/000?_auto_*.py
rm -rf api/migrations/__pycache__

2) マイグレションと起動
$ vi build
echo python36 manage.py makemigrations-------------------------------
python36 manage.py makemigrations

echo python36 manage.py migrate--------------------------------------
python36 manage.py migrate

echo python36 manage.py createsuperuser------------------------------
python36 manage.py createsuperuser

echo python36 manage.py runserver 0.0.0.0:8000-----------------------
python36 manage.py runserver 0.0.0.0:8000

4-2 起動
$ ./clean
$ ./build
ユーザID、mail、パスワード入力

0 件のコメント:

コメントを投稿

シャットダウン時の後処理 (shutdown)

# vi /etc/systemd/system/drop.service [Unit] Description= stop httpgwd DefaultDependencies=no Before=shutdown.target RefuseManualStart=true ...