lolipopスタンダード契約でDjangoをCGI経由で実行

  • 2022-03-20
  • 2022-03-20
  • lolipop
  • 340View
  • 0件

はじめに

  • Djangoの本格的なアプリは作成したことはない(書籍を見て最初のHello Worldを試したくらい)がlolipopで動かせられるのか興味があった
  • Flaskが動くのであればDjangoも動くのではないかと感じた
  • ネットで検索しても実行方法はほとんどヒットしなかった(みんなはそんなことしないでVPSを使用しているか、あたり前のことだからみんな書いていないか、そもそも実行できないかなど様々な理由があるんだと思う)
  • 前記事(Flask実行)の流れで試した

参考にさせていただいたサイト

さくらのレンタルサーバ(スタンダード)で Django 3.0 を動かす方法

https://blog.hgrs.me/20200723192138

djangoインストール

[pepper.jp-xxxxxxxx@std009 ~]$ pip3 install django
Defaulting to user installation because normal site-packages is not writeable
Collecting django
  Downloading Django-3.2.12-py3-none-any.whl (7.9 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.9/7.9 MB 71.5 MB/s eta 0:00:00
Collecting pytz
  Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 503.5/503.5 KB 57.2 MB/s eta 0:00:00
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.3/42.3 KB 15.1 MB/s eta 0:00:00
Collecting asgiref<4,>=3.3.2
  Downloading asgiref-3.5.0-py3-none-any.whl (22 kB)
Requirement already satisfied: typing-extensions in ./.local/lib/python3.7/site-packages (from asgiref<4,>=3.3.2->django) (4.1.1)
Installing collected packages: pytz, sqlparse, asgiref, django
Successfully installed asgiref-3.5.0 django-3.2.12 pytz-2021.3 sqlparse-0.4.2
[pepper.jp-xxxxxxxx@std009 ~]$ pip3 list
Package                Version
---------------------- -------
asgiref                3.5.0
click                  8.0.4
Django                 3.2.12
Flask                  2.0.3
importlib-metadata     4.11.3
itsdangerous           2.1.1
Jinja2                 3.0.3
MarkupSafe             2.1.1
mysql-connector-python 8.0.28
mysqlclient            2.1.0
pip                    22.0.4
protobuf               3.19.4
PyMySQL                1.0.2
pytz                   2021.3
setuptools             47.1.0
sqlparse               0.4.2
typing_extensions      4.1.1
Werkzeug               2.0.3
wheel                  0.37.1
zipp                   3.7.0

[pepper.jp-xxxxxxxx@std009 ~]$ python3 -m django --version
3.2.12

Djangoのプロジェクトを作成

設置場所

[pepper.jp-xxxxxxxx@std009 ~]$ cd ~/web/zzzz/
[pepper.jp-xxxxxxxx@std009 ~]$ mkdir django-test
[pepper.jp-xxxxxxxx@std009 ~]$ cd django-test

プロジェクト作成

[pepper.jp-xxxxxxxx@std009 django-test]$ django-admin startproject app    ※「app」はプロジェクト名
[pepper.jp-xxxxxxxx@std009 django-test]$ ls -al
合計 4
drwxr-xr-x 3 pepper.jp-xxxxxxxx LolipopUser  46  3月 19 22:21 .
drwxr-xr-x 4 pepper.jp-xxxxxxxx LolipopUser  97  3月 19 22:20 ..
drwxr-xr-x 2 pepper.jp-xxxxxxxx LolipopUser 113  3月 19 22:21 app
-rwxr-xr-x 1 pepper.jp-xxxxxxxx LolipopUser 659  3月 19 22:21 manage.py

各種確認

△site-packegesの場所を確認
[pepper.jp-xxxxxxxx@std009 django-test]$ python3 -c "import site; print (site.getsitepackages())"
['/usr/local/python/3.7/lib/python3.7/site-packages']

アプリの追加

アプリ追加の前に

いきなり「python3 manage.py startapp hello」を実行すると

  File "/home/users/2/pepper.jp-xxxxxxxx/.local/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 69, in check_sqlite_version
    'SQLite 3.9.0 or later is required (found %s).' % Database.sqlite_version
django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17).

というようにエラー「SQLite 3.9.0以上が必要」になるので、今回はMySQLを使用するようにapp/settings.pyの設定を下記のように修正する
今回は、SQLiteの設定をコメントにしてからmysqlの設定を追加した

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

####DATABASES = {
####    'default': {
####        'ENGINE': 'django.db.backends.sqlite3',
####        'NAME': BASE_DIR / 'db.sqlite3',
####    }
####}

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

アプリの追加

[pepper.jp-xxxxxxxx@std009 django-test]$ python3 manage.py startapp hello ※「hello」はアプリ名

各種ファイルの設置及び修正

フォルダ構成

  • ファイルのパーミッションは本来であれば全てのファイルに正しく設定しておかないといけないかもしれないがとりあえず動いている(index.cgiと.htaccessのみ設定)
  • 文字コードと改行コードも統一しておいたほうがいいのかもしれない(utf-8 LF)
左からファイル名、パーミッション、文字コード、改行コード
/home/users/2/pepper.jp-xxxxxxxx/web/zzzz/django-test
	index.cgi	    0700	utf-8	LF					
	.htaccess     0604	utf-8	CRLF
	manage.py     0755	utf-8	LF   ※「django-admin startproject app」で作成されたまま
	app           0755				※「django-admin startproject app」で作成されたまま
  __init__.py
  asgi.py
  settings.py
  urls.py
  wsgi.py
	hello         0755				※「python3 manage.py startapp hello」で作成されたまま
  __init__.py
  admin.py
  apps.py
  migrations
  models.py
  tests.py
  views.py
		render.html	0604	utf-8	CRLF

index.cgi (0700 utf-8 LF)

#!/usr/local/bin/python3

import sys
sys.path.append('/home/users/2/pepper.jp-xxxxxxxx/web/zzzz/django-test')  ※djangoプロジェクトをおいた場所(pwdで表示された場所)

#CGI スクリプトのトレースバック管理機構を有効
import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from app.wsgi import application  ※「app」はプロジェクト名

CGIHandler().run(application)

.htaccess (0604 utf-8 CRLF)

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

app/settings.py

#ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['*']  ※すべての端末からのリクエストを受け付ける

app/urls.py

from django.contrib import admin
from django.urls import path
import hello.views as hello  ※「hello」はアプリ名

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', hello.index),  ※「hello」のindexへのマッピングを追加
]

hello/views.py

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello Django!! こんにちは!!!!!!!")

実行アドレスと結果

.htaccessを作成していない場合

https://xxxxxxxx.pepper.jp/zzzz/django-test/index.cgi
	Page not found(404)

https://xxxxxxxx.pepper.jp/zzzz/django-test/index.cgi/hello
	Hello Django!! こんにちは!!!!!!!

.htaccessを作成している場合

https://xxxxxxxx.pepper.jp/zzzz/django-test
	Page not found(404)

https://xxxxxxxx.pepper.jp/zzzz/django-test/hello
	Hello Django!! こんにちは!!!!!!!

実行エラーになる場合に確認するところ

  • 550エラーになる場合は、index.cgiなどのパーミッション設定や、index.cgiの中身の設定が間違っている
  • エラー時のメッセージがブラウザに表示される場合はそれらに対して対処すれば良い(djangoのアプリ内のエラー)

最後に

  • このお試しではHello World的なことをやりましたので、最終的に問題があるのかどうなのかはわからないです
  • 実際にDBへのアクセスや、djangoのフレームワークの機能などを使いこなすとなると問題が出てくるかもしれない
最新情報をチェックしよう!