Django

【Django】エックスサーバーで公開する

環境

  • TeraTermを使用してエックスサーバーに接続
  • minicondaをエックスサーバー上にインストール済
  • python3.9

1.プロジェクトを作成する

ローカル環境でサイトを作成する

プロジェクト名Config
アプリ名app

2.エックスサーバー内に仮想環境を作成する

TeraTermを使用し、エックスサーバー内に入る。
minicondaで仮想環境を作成し、必要なモジュールをインストールする。

3.必要なファイルを作成する

.htaccess の作成

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django/condig/index.cgi/$1 [QSA,L]

index.cgiの作成

#!/home/*ユーザー名*/miniconda3/envs/env/bin/python3.9 #Pythonのパス
# -*- coding: utf-8 -*-

import sys, os

sys.path.insert(0, '/home/*ユーザー名*/miniconda3/envs/env/bin') #仮想環境までのパス

os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings' #プロジェクトのsettingsまでのパス


from wsgiref.handlers import CGIHandler
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
CGIHandler().run(application)

minicondaでは「envs」というディレクトリ内に仮想環境が作成される。
今回は「env」という仮想環境を作成し、使用している。

4.プロジェクトをサーバーにアップロードする

作成したプロジェクトをZipに圧縮し、
エックスサーバーのファイルマネージャーにアップロードして展開する。

今回はサブドメインの中に作成した「django」というフォルダ内に展開した。

フォルダ構成
HOME
│
└─domain.com
        └─public_html
              └─sub.domain.com
                     └─django
                            └─config
                                   ├─Templates
                                   ├─config
                                   ├─makeapp
                                   ├.htaccess
                                   ├index.cgi
                                   ├manage.py

5.index.cgiのパーミッションを変更する

index.cgiのパーミッションを「755」に変更する。

6.プロジェクトファイルの内容を修正する

settings.pyの修正

下記リストの内容を修正する

  • DEBUG
  • ALLOWED_HOSTS
  • STATIC_ROOT (無い場合は追加)
  • MEDIA_ROOT (無い場合は追加)
DEBUG = False

ALLOWED_HOSTS = ['sub.domain.com']

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_ROOT =  BASE_DIR / 'media'

※1セキュリティ

セキュリティ上、settingsの中身やAPIキー等知られたくない情報は
別ファイルを作成しそこからインポートすると良い。

※2MySQLを使用する場合

エックスサーバーのサーバーパネルからDBを新規作成

①データベース -> MySQL設定 -> MySQL追加

データベース名:好きな名前
文字コード:UTF-8

②データベース -> MySQL設定 -> MySQL一覧

①で作成したデータベースのアクセス権所有ユーザを追加する。

※MySQLユーザ追加で事前に新規ユーザを追加しておくと良い○

<settings.py>DATABASEの修正

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '*データベースの名前*',
        'USER': '*ユーザー名*', 
        'PASSWORD': '*パスワード*',
        'HOST': '*IPアドレス*',
        'PORT': '*ポート番号*',
        'OPTIONS': {
            'charset': 'utf8mb4',
        }
    }
}

サーバーパネルのMySQL設定に下記画像のような表があるので情報を持ってくる。

データベースの文字コードを変換する

①phpmyadminにログインする

エックスサーバーのサーバーパネルから「phpmyadmin」をクリックし、ログインする。

②SQLから文字コードを変更する

自分の作成したデータベース名を選択

SQLタブを選択し、下記コマンドを入力(データベースの文字コードをすべて[utf8mb4]に変更する。)
※db_nameは自分が作成したデータベースの名前

ALTER DATABASE db_name
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_general_ci;

7.TeraTermを起動する

TeraTermを起動し、エックスサーバーのサーバーに接続する。

サーバーにアップロードしたプログラムの「manage.py」が置いてある階層に移動する。

cd *移動したいディレクトリのパス*

自分が今いるディレクトリ情報を取得する場合↓

pwd

ディレクトリの移動が終わったら仮想環境に入っておく。

minicondaの場合

conda activate *仮想環境名*

8.cssを集める

python manage.py collectstatic

9.マイグレーションする

manage.pyのある作業ディレクトリまで移動する。

python manage.py makemigrations
python manage.py migrate

migrateした後にもう一度phomyadminを開き、テーブルの「照合順序」を確認してみる。

utf8mb4_general_ciになっていればOK

10.スーパーユーザーを作成する

python manage.py createsuperuser
ユーザー名 (leave blank to use '***'): *好きなユーザー名*
メールアドレス: *アドレス*
Password: *好きなパスワード(表示されない)*
Password (again):*好きなパスワード(表示されない)* 
Superuser created successfully.

11.サイトにアクセスしてみる

アプリのurls.pyで’/index/’でurlを作成しているため
今回の場合のリンクは

https://sub.domain.com/django/config/index/

となる。

+α プログラムを定期実行させる

エックスサーバーのサーバーパネル内にあるCron設定から
プログラムを定期実行するスケジュールを組める。

仮想環境でDjangoを実行している場合コマンドには

仮想環境のPythonまでのパス(index.cgiの一番上に書いたのと同じ)
+
半角スペース
+
プログラムまでのパス

を記載する。

/home/*仮想環境までのパス*/python*バージョン* / /home/*プログラムまでのパス*/program.py

あとは時間や曜日を設定すればOK

曜日:日曜始まりで 0~6で設定