プログラミング > Python >

Webページの公開

2023-02-06

目次

いつでもどこでも誰もが見られるWebページ

   今まではローカルネットワーク「http://127.0.0.1:8000/」上に設置していた。世界中に公開するには「127.0.0.1」ではなく、公開のためのドメインを取得する必要がある(例えば「sample.com」や「test.jp」など)。このドメインを通して世界中で繋がっているネットワークに公開される。
   次にドメインにサーバーを設置する。サーバーを設置することによって訪問者にアクセスされたとき、どのように返答するかを管理する。大抵の場合、index.htmlindex.phpなどのファイルを返し、Webページを表示している。
   サーバー内はディレクトリ構造になっていて公開用のフォルダーを用意する必要がある。今回は「/home/user_name/www/test」が公開フォルダとして話を進める。またドメイン名は「test.domain」とする。つまり、「http://test.domain/test」にアクセスするとWebページが表示されるようにする。

準備と方針

   準備として必要なのはサーバーとドメインの取得である。今回、サーバーはレンタルサーバーを想定している。レンタルサーバーを借りると初期でドメインも使えるところがある。レンタルサーバーの場合、常時プログラムを動かし続けることが困難なので後に述べるcgiファイルを用いている。余談だが、レンタルサーバーの上位であるVPSやクラウドサーバー、専用サーバーはサーバーのOSから管理しなくてはいけないのでハードルが高いと感じた。自分で管理できる点制限がなく自由にできるというメリットはある。
   方針としては
  1. djangoを使うためpython環境を整えるためにpyenvとpyenv-virtualenvを導入
  2. 環境を整えた後、djangoでwebページを設置
  3. cgiファイルを使ってアクセスされたときページを表示
のように行う。

サーバー内でpython環境を整える

   サーバーにsshでログインする。
                    
ssh user_name@test.domain
                
   bashで操作を行うためシェルを変える。
                    
cash -s /usr/local/bin/bash
bash
echo $bash
                
   GitHubからpyenvpyenv-virtualenvをサーバーにクローン (ダウンロードして移動) する。
                    
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src
git clone https://github.com/pyenv/pyenv-virtualenv.git~/.pyenv/plugins/pyenv-virtualenv
                
   .bashrc.bash_profileに以下を追記する。これらのファイルがない場合ファイルを作成する。
                    
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
                
   pyenvpythonをインストールし、pyenv-virtualenvで仮想環境を構築する。今回はdjango_testという環境名。そしてその仮想環境をアクティブにする。そして仮想環境内でdjangoをインストールする。
                    
pyenv install 3.7.13
pyenv  virtualenv 3.7.13 django_test
pyenv activate django_test
Pip install django
                

djangoでWebページを設置する

   python環境を実行したいディレクトリに移動し、そのディレクトリ以下でpythonの環境を使えるようにする。また公開するフォルダ「test」を作成しておく。
                    
cd /home/user_name/www
pyenv local django_test
mkdir test
                
   このあとはdjangoを設置していく。
                    
django-admin startproject ProjectName
cd ProjectName
python manage.py startapp webpage
                
   続いてsettings.pyを以下を追記する。
   DEBUGはテスト環境 (True) と本番環境 (False) を設定する。テスト環境では何かエラーがあるとエラー内容を示してくれるが様々な変数の値が見えてしまうのでセキュリティ的に良くない。そのためFalseを設定する。
コード1.
/home/user_name/www/ProjectName/ProjectName/settings.py
                    
DEBUG = False
ALLOWED_HOSTS = ['test.domain']
INSTALLED_APPS = [
	'django.contrib.admin',
	'django.contrib.auth',
	'django.contrib.contenttypes',
	'django.contrib.sessions',
	'django.contrib.messages',
	'django.contrib.staticfiles',

'webpage.apps.WebpageConfig', ] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo'
   urls.pyviews.pyindex.htmlを作成していく。
コード2.
/home/user_name/www/ProjectName/ProjectName/urls.py
                    
from django.contrib import admin
from django.urls import path, include
from django.views.generic import RedirectView

urlpatterns = [ path('admin/', admin.site.urls), path('webpage/', include('webpage.urls')), path('', RedirectView.as_view(url='webpage/', permanent=True)), ]
コード3.
/home/user_name/www/ProjectName/webpage/urls.py
                    
from django.urls import path
from . import views

app_name = 'webpage' urlpatterns = [ path('', views.index, name='index'), ]
コード4.
/home/user_name/www/ProjectName/webpage/views.py
                    
from django.shortcuts import render


def index(request): return render(request, 'index.html')
コード5.
/home/user_name/www/ProjectName/templates/index.html
                    
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Webページ</title>
</head>
<body>
<div style="text-align: center; line-height: 100vh;">
	<h1>ようこそWebページへ!</h1>
</div>
</body>
</html>
                

cgiファイルの設置

   index.cgiを以下のようにして「https://your.doamin/test/index.cgi/webpage/」にアクセスすると公開される。
コード6.
/home/user_name/www/test/index.cgi
                    
#!/home/user_name/.pyenv/versions/3.7.13/envs/django_test/bin/python3.7
# coding: utf-8
import sys
import os

from wsgiref.handlers import CGIHandler from django.core.wsgi import get_wsgi_application

sys.path.append(‘/home/user_name/www/ProjectName’) os.environ['DJANGO_SETTINGS_MODULE'] = 'ProjectName.settings'
application = get_wsgi_application() CGIHandler().run(application)