2020年6月18日木曜日

Django プロジェクト作成

1.環境構築
1-1 インストールモジュールとバージョン

$ python3 --version
Python 3.6.8

$ mysql --version
mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)

$  mysql --version
mysql  Ver 15.1 Distrib 10.3.17-MariaDB, for Linux (x86_64) using readline 5.1

1-2 pythonのインストール

python Ver3.6をインストール

# yum install python36 python3-libs python36-devel
# python36 -m ensurepip       # pip(パッケージ管理ツール) を使えるようにする。
                              # 以降は、pipでパッケージをインストール。

1-3 python仮想実行環境の構築
pythonは、様々なバージョンの組み合わせの仮想実行環境を構築する事ができます。
# cd /usr/bin
# ln -s /usr/libexec/platform-python3.6 python36
# mkdir ~/Python_env
# cd ~/Python_env
# python36 -m venv venv36-d30
(# chmod -R a+rq /usr/local/venv36-d30)             # 一般ユーザで実行する場合
$ source ~/Python_env/venv36-d30/bin/activate

※下記環境がセットされる。
VIRTUAL_ENV=/home/takahab/Pyhton_env/venv/venv36
PATH=/home/takahab/Python_env/venv/venv36-d30/bin:$PATH
deactivate () {}

※ 必要なモジュールをpip3でインストールする。

1-4 Djangoのインストール
Django 3.0をインストール
$ pip3 install --upgrade pip
$ pip3 install Django

$ pip3 list
Package    Version
---------- -------
asgiref             3.2.10
Django             3.0.9
pip                     20.2
pytz                   2020.1
setuptools     39.2.0
sqlparse          0.3.1


1-5 モジュール更新( アプリケーションのバージョン環境に合わせる)

$ source /usr/local/venv36-d30/bin/activate
$ pip3 install --upgrade pip   (--proxy=http://192.168.1.xx:3128)
$ pip3 list
$ pip3 list --outdated               # 更新モジュールを表示します。
$ pip3 list --outdated | awk 'NR>2 {print $1}' | xargs pip3 install -U
$ pip3 freeze>requirements.txt
$ pip3 install -r requirements.txt   # requirements.txt内のバージョンの
                                     # モジュールをインストールします。

1-6 Djangoプロジェクトの作成

$ django-admin startproject Config
$ mv Config Project
$ cd Project
$ python36 manage.py startapp app

Project
├── Config
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   └── settings.cpython-36.pyc
│   ├── asgi.py
│   ├── settings.py          # 各種設定
│   ├── urls.py
│   └── wsgi.py              # Web Server Gateway Interface(ウィズギー)
├── app
│   ├── __init__.py
│   ├── admin.py

│   ├── apps.py
│   ├── migrations            # データベース定義を自動的に作成管理するコードが自動生成される。
│   │   └── __init__.py
│   ├── models.py             # データベースフィルド定義
│   ├── tests.py
│   └── views.py              # GET/POST 処理
└── manage.py


1-7 settings.pyの編集

$ vi ./Config/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',
  'app.apps.ApiConfig',             # 追記
]


$ vi Config/urls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),

    path('app/', include('app.urls',   namespace='app')),    # 追記
]


# 以下、新規ファイル作成
$ vi app/urls.py
from django.urls import path
from . import views

app_name = 'app'

urlpatterns = [
    path('',        views.Index_View.as_view(), name='index') ,
    path('index/',  views.Index_View.as_view(), name='index') ,
]


2 デーベース

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

mysql> create database django;            # django用空DB作成

mysql> use mysql
mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| admin            | %         | mysql_native_password |<--※
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
mysql> quit

2-2 settings.pyの設定

$ vi Config/settings.py
import pymysql
pymysql.install_as_MySQLdb()
※  mysqlデータベースのバージョンによって初期化方法は異ります。

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

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

2-3 oracleの設定
# python36 -m pip install cx_oracle

ここから該当バージョンのドライバをタウンロード
https://www.oracle.com/technetwork/jp/database/features/instant-client/index-352321-ja.html
instantclient-basic-linux.x64-11.2.0.4.0.zip

# cd /opt/libs
# unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
# ln -s /opt/libs/instantclient_11_2 /opt/libs/oracle
# vi /etc/profile
export LD_LIBRARY_PATH=/opt/libs/oracle:$LD_LIBRARY_PATH
# . /etc/profile

# vi /etc/sysconfig/httpd
LD_LIBRARY_PATH=/opt/libs/oracle:$LD_LIBRARY_PATH



3. サービスの起動(デバック起動)
3-1 起動前準備

1) キャシュクリア
$ vi clean
rm -f  app/migrations/000?_initial.py
rm -f  app/migrations/000?_auto_*.py
rm -rf app/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

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

※ 2回目以降のユーザ名入力は、[Cntl+C]でキャンセルする事ができます。


4. Apache連携_(20210726更新)

VENV仮想環境を構築してから下記を行う。
0) コンパイル環境とHTTPD開発環境をインストール
# dnf group install "Development Tools"
# dnf install httpd-devel
# dnf install python36-devel
# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
# dnf install MariaDB-devel

1) WSGIインストール
$ pip3 install mod-wsgi
$ pip3 install mod-wsgi-httpd
※ mod-wsgi-httpdは、少し時間がかかる


$  pip3 freeze|grep wsgi
mod-wsgi==4.8.0
mod-wsgi-httpd==2.4.46.1

# vi /etc/httpd/conf.modules.d/20-wsgi.conf
LoadModule wsgi_module /var/www/wsgi/test/myenv/venv36-d324/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

# vi /etc/httpd/conf.d/wsgi.conf

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

WSGISocketPrefix /var/run/wsgi

WSGIDaemonProcess test user=apache group=apache processes=10 threads=15 \
       home=/var/www/wsgi/test\
       python-home=/var/www/wsgi/test/myenv/venv36-d324 \
       python-path=/var/www/wsgi/test/django:/var/www/wsgi/test/myenv/venv36-d324/lib/python3.6/site-packages

WSGIScriptAlias  /test /var/www/wsgi/test/Config/wsgi.py process-group=test

Alias /static/  /var/www/wsgi/test/static/
Alias /media/   /var/www/wsgi/test/media/

WSGIPassAuthorization on

<Location /test>
       WSGIProcessGroup test
</Location>




4. Apache連携

VENV仮想環境を構築してから下記を行う。

0) コンパイル環境とHTTPD開発環境をインストール
# dnf install httpd
# dnf group install "Development Tools"
# dnf install httpd-devel

1) WSGIインストール
# pip3 install mod-wsgi
# pip3 install mod-wsgi-httpd
# ※ mod-wsgi-httpdは、少し時間がかかる。
# pip3 freeze|grep wsgi
mod-wsgi==4.6.5
mod-wsgi-httpd==2.4.35.1
# ls /usr/local/venv36/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

※ pip3 install mod-wsgiで下記エラーが発生
※RuntimeError: The 'apxs' command appears not to be installed or is not executable.
下記をインストール
# dnf install httpd-devel

2) Apache(httpd)の設定
# vi /etc/httpd/conf.modules.d/20-wsgi.conf
LoadModule wsgi_module /usr/local/venv36/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
# httpd -M|grep wsgi
wsgi_module (shared)
# vi /etc/httpd/conf.d/wsgi.conf
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300 

WSGIApplicationGroup %{GLOBAL}

WSGISocketPrefix /var/run/wsgi

WSGIDaemonProcess test user=apache group=apache processes=1 threads=100 maximum-requests=10000 \
       home=/var/www/wsgi/test \
       python-home=/var/www/wsgi/test/myenv/venv36-d324 \
       python-path=/var/www/wsgi/test/django:/var/www/wsgi/test/myenv/venv36-d324/lib/python3.6/site-packages \
       lang=ja_JP.utf8

WSGIScriptAlias  /test /var/www/wsgi/test/Config/wsgi.py process-group=test

Alias /static/  /var/www/wsgi/test/static/
Alias /media/   /var/www/wsgi/test/media/

WSGIPassAuthorization on

<Location /test>
       WSGIProcessGroup test 
</Location>


# vi /etc/sysconfig/httpd
LD_LIBRARY_PATH=/opt/libs/oracle:$LD_LIBRARY_PATH

# mkdir /var/www/wsgi

# apachectl configtest
Syntax OK
# curl localhost/analyze
# systemctl restart httpd

※pip3 install 時のエラー
ERRPR:   /bin/sh: mariadb_config: コマンドが見つかりません
# yum install MariaDB-devel
ERROR: /usr/bin/ld: -lmariadb が見つかりません
# yum install MariaDB-shared
ERROR: ImportError: Unable to find zbar shared library
# yum install zbar

5. ディレクトリ体型

Analyze                          # プロジェクト
├── Config                       # プロジェクトの設定
│   ├── routers.py
│   ├── settings.py              # 各種設定
│   ├── urls.py                  # URL(ベース)
│   └── wsgi.py
├── README
├── Users                        # ログインアプリ
│   ├── __init__.py
│   ├── __pycache__
│   ├── migrations
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── models.py                # データベースが自動生成される。
│   ├── tests.py
│   ├── urls.py
│   └── views.py                 # リクエスト(get/post)を受けてレスポンスを返す。
├── api                          # クラウドAPI
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apis_net.py
│   ├── apis_ttg.py
│   ├── apps.py
│   ├── database_net.py
│   ├── database_ttg.py
│   ├── errors.py
│   ├── main.py
│   ├── models.py
│   ├── sliputil.py
│   ├── tables.py
│   ├── tests.py
│   ├── totalizer.py
│   ├── urls.py
│   └── views.py
├── app                          # 顧客情報照会アプリ
│   ├── __init__.py
│   ├── __pycache__
│   ├── migrations
│   ├── admin.py
│   ├── apps.py
│   ├── business.py
│   ├── forms.py
│   ├── jasper.py
│   ├── models.py
│   ├── ora2xls.py
│   ├── oracle.py               # oracle sql クラス定義
│   ├── oracle_base.py          # oracle sql ベースクラス
│   ├── oracle0.py              # oracle sql ファイル(サンプル)
│   ├── oracle1.py              # oracle sql ファイル(コールセンター用SQL)
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── menu                          # メニューアプリ
│   ├── __init__.py
│   ├── __pycache__
│   ├── migrations
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── menus.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── shop                         # レジ検証アプリ(ネットショップ)
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── core
│   │   ├── README
│   │   ├── carts.py
│   │   ├── cipher.py
│   │   ├── cloud.py
│   │   ├── databases.py
│   │   ├── payments.py
│   │   ├── settings.py
│   │   └── slips.py
│   ├── forms.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   ├── utils.py
│   └── views.py

├── assets                       # static 収集領域
├── static                       # static 格納場所(bootstrap,js,css 等 )
├── media                        # upload 等領域
├── templates                    # Django テンプレート
│   ├── Users
│   ├── app
│   ├── menu
│   └── shop

├── env                          # 仮想環境設定シェル
├── clean                        # キャッシュ/マイグレション情報クリアシェル
└── build                        # マイグレーション&デバック実行


6. djangoフレームワーク

6-1 構造


    DB────>sql────>VIEW────>context──── template── SCREEN(data table)  # 検索、並び換えが可能
                             │                  └──>SCREEN(chartjs)    # 各種グラフ
                             ├─── jasperReport(pdf)
                             ├─── jasperReport(excel)   # ページ区切り有
                             ├─── jasperReport(csv)     # ページ区切り有
                             ├─── jasperReport(json)    # ページ区切り有
                             ├─── dataGenerator(excel)  # ページ区切り無
                             ├─── dataGenerator(csv)    # ページ区切り無
                             └─── dataGenerator(json)   # ページ区切り無


views.py

  context ={ 'fields':{ 'key1':val1, 'key2:val2 } }

template.html

       {% for key, val in fields.items %}
          {{ key }}:{{ val }}
       {% endfor %}


  ※  python 表記

       fields = context[ 'fields' ]
       for key , val in fields.items():
          print( key, ':', val )

2020年6月4日木曜日

CentOS8 samba インストール

sh-4.4# dnf -y install samba
sh-4.4#  which smbd nmbd
/sbin/smbd
/sbin/nmbd
sh-4.4# systemctl start smb nmb
sh-4.4#  systemctl enable smb nmb
Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/nmb.service → /usr/lib/systemd/system/nmb.service.

sh-4.4# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp39s0
  sources:
  services: cockpit dhcpv6-client mysql ssh
  ports: 3389/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

sh-4.4#  firewall-cmd --add-service=samba --permanent
success
sh-4.4#  firewall-cmd --reload
success
sh-4.4#  firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp39s0
  sources:
  services: cockpit dhcpv6-client mysql samba ssh
  ports: 3389/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

sh-4.4# vi /etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
workgroup = WORKGROUP
server string = SAMBA SERVER Version %v
netbios name = fs
security = user

passdb backend = tdbsam

dos charset = CP932
wins support = yes
# printing = cups
# printcap name = cups
load printers = no
disable spoolss = yes
# cups options = raw

[Share]
comment = Share Folder for All Users
path = /home/share/
browsable = yes
read only = no

[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes

#[printers]
# comment = All Printers
# path = /var/tmp
# printable = Yes
# create mask = 0600
# browseable = No
#
#[print$]
# comment = Printer Drivers
# path = /var/lib/samba/drivers
# write list = @printadmin root
# force group = @printadmin
# create mask = 0664
# directory mask = 0775
sh-4.4#
sh-4.4# cd /home
sh-4.4# mkdir share
sh-4.4# chmod -R a+rwx share
sh-4.4# chown -R nobody:nobody share
sh-4.4# # systemctl restart smb nmb
sh-4.4# systemctl status smb nmb
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-06-04 15:22:26 JST; 59min ago
     Docs: man:smbd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 27908 (smbd)
   Status: "smbd: ready to serve connections..."
    Tasks: 4 (limit: 26213)
   Memory: 19.7M
   CGroup: /system.slice/smb.service
           ├─27908 /usr/sbin/smbd --foreground --no-process-group
           ├─27911 /usr/sbin/smbd --foreground --no-process-group
           ├─27912 /usr/sbin/smbd --foreground --no-process-group
           └─27913 /usr/sbin/smbd --foreground --no-process-group

 6月 04 15:22:26 libra.jp systemd[1]: Starting Samba SMB Daemon...
 6月 04 15:22:26 libra.jp smbd[27908]: [2020/06/04 15:22:26.332766,  0] ../../lib/util/become_daemon.c>
 6月 04 15:22:26 libra.jp smbd[27908]:   daemon_ready: daemon 'smbd' finished starting up and ready to>
 6月 04 15:22:26 libra.jp systemd[1]: Started Samba SMB Daemon.

● nmb.service - Samba NMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/nmb.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-06-04 15:22:26 JST; 59min ago
     Docs: man:nmbd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 27909 (nmbd)
   Status: "nmbd: ready to serve connections..."
    Tasks: 1 (limit: 26213)
   Memory: 5.3M
   CGroup: /system.slice/nmb.service
           └─27909 /usr/sbin/nmbd --foreground --no-process-group

 6月 04 15:23:00 libra.jp nmbd[27909]:
 6月 04 15:23:00 libra.jp nmbd[27909]:   Samba name server LIBRA is now a local master browser for wor>
 6月 04 15:23:00 libra.jp nmbd[27909]:
 6月 04 15:23:00 libra.jp nmbd[27909]:   *****
 6月 04 15:23:00 libra.jp nmbd[27909]: [2020/06/04 15:23:00.369477,  0] ../../source3/nmbd/nmbd_become>
 6月 04 15:23:00 libra.jp nmbd[27909]:   *****
 6月 04 15:23:00 libra.jp nmbd[27909]:
 6月 04 15:23:00 libra.jp nmbd[27909]:   Samba name server LIBRA is now a local master browser for wor>
 6月 04 15:23:00 libra.jp nmbd[27909]:
 6月 04 15:23:00 libra.jp nmbd[27909]:   *****


sh-4.4# pdbedit -a -u takahab -f "Masanobu Takahashi"
new password:
retype new password:
Unix username:        takahab
NT username:       
Account Flags:        [U          ]
User SID:             S-1-5-21-3479312465-2406587434-1385072247-1000
Primary Group SID:    S-1-5-21-3479312465-2406587434-1385072247-513
Full Name:            Masanobu Takahashi
Home Directory:       \\fs\takahab
HomeDir Drive:     
Logon Script:       
Profile Path:         \\fs\takahab\profile
Domain:               FS
Account desc:       
Workstations:       
Munged dial:       
Logon time:           0
Logoff time:          木, 07  2月 2036 00:06:39 JST
Kickoff time:         木, 07  2月 2036 00:06:39 JST
Password last set:    木, 04  6月 2020 16:03:13 JST
Password can change:  木, 04  6月 2020 16:03:13 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
sh-4.4# pdbedit -L
takahab:1000:Masanobu Takahashi
sh-4.4# pdbedit -L -v -w
---------------
Unix username:        takahab
NT username:       
Account Flags:        [U          ]
User SID:             S-1-5-21-3479312465-2406587434-1385072247-1000
Primary Group SID:    S-1-5-21-3479312465-2406587434-1385072247-513
Full Name:            Masanobu Takahashi
Home Directory:       \\fs\takahab
HomeDir Drive:     
Logon Script:       
Profile Path:         \\fs\takahab\profile
Domain:               FS
Account desc:       
Workstations:       
Munged dial:       
Logon time:           0
Logoff time:          木, 07  2月 2036 00:06:39 JST
Kickoff time:         木, 07  2月 2036 00:06:39 JST
Password last set:    木, 04  6月 2020 16:03:13 JST
Password can change:  木, 04  6月 2020 16:03:13 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
LM hash             : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
NT hash             : 2C356A91505CE6E3673D17DDB5BCC0E4

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

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