はじめに
- 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のフレームワークの機能などを使いこなすとなると問題が出てくるかもしれない