さくらのレンタルサーバでPython3のDjango3(CGI版)を動かす方法

お金も無いのでアルバイトがやりたいと言ってたら、Web開発の業務が舞い込んだ。

 
 

私「使えるプログラミング言語はPerl、PHP、Pythonです。」

担当「Ruby on Rails使えないとか、もうね・・・仕事なんて無いよ。」

私「勉強を始めました!インストールまで完了しました。」

Ruby on Railsをインストール(さくらのスタンダードプラン、Windows、Ubuntu)
PPAPペンパイナッポーアッポーペンではなく、私の使えるWeb言語。PHP、Perl、Ajax(JS)、Python10年前に「Ruby」と「Python」...

 

担当「いや、そんなレベルいらないから!!お荷物だから!」

 


 

「不採用」じゃねーか!

40歳にもなって、アルバイトもロクに採用されねーのかよ、俺。

そもそも「Ruby on Rails」なんてオワコンだろ。

このWebフレームワークの人気(月の質問数)グラフを担当者に突きつけたいわ。

あきらかに今から必要なのは「Django」か「Laravel」ができるエンジニアじゃん。

 

てか、過去の日記見たら「Laravel」は2017年の学習目標だった・・・

去年の反省と2017年の抱負
2016年の鏡リュウジの占いは次のとおりでした。秋以降は、意外な仕事がきっかけで新しい能力が開花することになりそう。将来への展望が見えてくるでしょう。8月は一年間の幸運期に入ります。チャレンジを楽しみましょう。新...

遊んでる場合じゃねー、何やってんだよ過去の俺!

Python3をCGIで動かす事前準備

そもそも、PythonでCGI(Common Gateway Interface)を使用したことがない。そこから挑戦。

さくらインターネットでPython3のCGIで「Hello world」を表示する

ハマった・・・・。なんどやっても「500 Internal Server Error」が表示される。

そもそも which コマンドを使うと次のようなパスが表示される。

このパスからの呼び出しはできない。次のようなエラーが出た。

エラーの内容からは意味が分からない。CGIはここが良くない。

で、ネットで色々と確認して修正。かつアップロードするファイルも次のような規則がある。

  • 文字コード: UTF-8N(BOMが付いていないUTF-8)
  • 改行コード: LF
  • パーミッション:755(-rwxr-xr-x)

これで正しく「Hello world」が見れた。表示が遅いな。

【付録】treeコマンドがない環境でツリー構造で表示する

Findコマンドを使うとワンライナーで実現が可能だ。

これは単なるTipsだけど、知っていて損はない。

さくらインターネットで、django(CGI版)を使う方法

さくらインターネット(スタンダードプラン)は他のユーザとの共有サーバのためデーモンは禁止されており、runserverで立てたDjangoのプロセスは、ターミナルを閉じるとkillされてしまう。

そこで、1アクセスされるたびにプロセスを立ち上げるCGIを利用してDjangoを動作させる方法があるらしい。

だから、PythonをCGIで実行するところから始めた。

cgiでDjangoを使えるようにする

python3 で Django を動かすには次のように書く。データベースはsqlite3にしている。

モジュールがなければ「pip」でインストール。

無事に動けばバージョンが表示される。うん正常。

サンプルを動作させる

適当に「Python Django simple」でググって一番最初に出てきたソースコード。CRUDとは「Create、Read、Update、Delete」のこと。

GitHub - okoppe8/Django-Simple-CRUD-Sample: Djangoのチュートリアル用サンプルアプリケーションです。
Djangoのチュートリアル用サンプルアプリケーションです。. Contribute to okoppe8/Django-Simple-CRUD-Sample development by creating an account on GitHub.

解凍して必要なライブラリはインストールしておく。

完了。はい次!

python3用のdjango3.cgiを設置

ネットを調べると「django-python3.cgi」を使って、CGIとしてDjangoを動かすことができるらしい。

ダウンロードしてリネームして実行権限をつける。

CGIとして動かす方法は前述通り。

で、各種設定を変更する。

「DJANGO_SETTINGS_MODULE」には、settings.pyが存在するパスを指定してあげるっぽい。

つまり今回は「project」→「settings」だ。

では、URLを叩いていざ実行。

エラーではあるが「500 Internal Server Error」ではない。一歩前進した感じがある。

Invalid HTTP_HOST header: ”. You may need to add ” to ALLOWED_HOSTS

エラーの説明通り、settings.py中のALLOWED_HOSTS変数へアクセスを許可するホスト名を記載する。

これでページが表示されるようになった。

no such table: auth_user

色々とページを飛んでると、エラーが表示された。

no such table: auth_userとなっているので、migrateしてあげる。

migrateをすることで、データベース構成を変更したり、その変更を取り消したりすることができる。

更にユーザを作成。てかGitHubのReadmeに書いてあったわ。

で、再度実行。

お、動いた!

no such table: main.auth_user__old

エラーが出てユーザ登録が出来なかった・・・・。

SQALightの仕様が変わったのが原因っぽい。バージョンを落とすと動作するっぽいけど、そんな事はしたくないよ。

 
 

またサンプル探してみる。

GitHub - Aris-haryanto/Simple-CRUD-with-Django-SQLite-3: Simple CRUD with Django 1.10 & SQLite 3
Simple CRUD with Django 1.10 & SQLite 3. Contribute to Aris-haryanto/Simple-CRUD-with-Django-SQLite-3 development by creating an account on GitHub.

お!

CSSのパス修正が必要だったが、こっちは動いた。

[settings.py]

各子ページに移動する

最初、urls.pyの中を書き換えて root パスで各ページを見えるようにしていた。

これは「.htaccess」に次のように書けば良い。

そうすれば「django3.cgi/firstapp/」や「django3.cgi/admin/」というURLで各子画面に遷移できるようになる。

んもう、早く言ってよ・・・・。

まとめ

さくらのスタンダード(500円)でpython3 + Django3 が使えるのは嬉しいね。Ruby on Railsは動かせなかったし。

ただ、叩くたびにpythonのライブラリを全て読み込んでいるのか、1リクエストあたり1秒程度かかり、非常に動作は遅い。

WordPress等もキャッシュを使わないと同様に重く、Djangoだけが遅いというわけではないが・・・・。

お試し公開サービスぐらいには使えるし、Ruby on RailsよりDjangoは直感的で分かりやすい気がする。

タイトルとURLをコピーしました