極私的視点(再)

思いついた時に、思いつきの文章とそれっぽい写真を大公開です。

Pythonanywhereを使ってみた(今回はPythonネタです)

わからないならインターネッツを調べてみよう

Pythonの勉強でWEBで動くヤツを作ってみたんだが、ローカルで動かすのもつまらないので、なにかインターネット上で動かせないかと探してみたらまず見つかったのが「Heroku」でした。

クラウド・アプリケーション・プラットフォーム | Heroku

こちらは環境にちょっとクセがあったりするけどデプロイは簡単で、自分が勝手に作ったプログラムがインターネット上で動くのを確認してちょっとカンドーした。でもDjangoを使ったときの静的ファイルの扱いなどがよくわからんから現在はstreamlitというライブラリを利用した新型コロナ関連情報のポータルサイトを動かすして、日本政府の不甲斐なさを嘆いております。緊急事態宣言発令とか終了に合わせて時々メンテしたりしております。

st_covid19 · Streamlit (thawing-lowlands-93532.herokuapp.com)

 んで、ほかにも無料で利用できるサービスが無いかと探してみると見つかったのが「Pythonanywhere」というサービスだったので、こっちも使おうとしてみたんだけど使い方がよくわからない。なので早速ググってみたわけです。

Host, run, and code Python in the cloud: PythonAnywhere

今回いちばん言いたかったこと「オマエラ、実際に動かしてみたんか?」

で、日本語の紹介がたくさんヒットしたからそいつらを参考にしていじってみたんだがうまくいかん。なんでうまくいかんのじゃと人のせいにしながら軽く怒りつつ続けて色々と試してみた。すると見つかったそれらのサイトの記述には書いてることは同じで体裁だけが違うだけのものがたくさんあるのに気がついた。ってか、同じじゃん。その上「githubにある自分のソースをデプロイするやり方」の説明で「これでデプロイ完了です」と書いているのに、そこに掲載されているデプロイが完了した「あなたの画面」は、Djangoでプロジェクト作成後に立ち上げみるテストサーバーの画面だったりするわけで、それは自分のサービスじゃないだろ?それはDjangoが出してるテスト用初期画面だろ?そんな程度で「これであなたのサービスが公開できる」とドヤ顔のサイトがたくさんあったのでガッカリする。

オマエラ、実際に動かしてないだろ?他のサイトを見て、コピペしてエラそうにしてるだけだろ?!そんなの勉強しようとしているヒトタチのノイズになるだけだからやめろ。

f:id:tonytani37:20210620005318p:plain

これはDjangoの環境が正しく作られたかどうか確認するときの画面で、コードを一行も書かなくても出てくるヤツ。PythonanywhereでDjangoのサービスを作成しただけで出てくるヤツ。こいつは日本語設定もされてない手抜きなヤツ。

もちろん詳しく丁寧に書かれたサイトもあるんだが、詳しすぎて素人のワシにはよくわからんかったから、これからPythonanywhereを触ってみたいと思っている初心者のヒトタチのためにワシがやって実際に動くまでにやったことを書いてみる。これが正しいやり方かどうかはわからんが、取りあえず動いたのでやって見る価値がゼロではないよ。

Pythonanywhereの登録とかは他の詳しいサイトを参照すべし

Pythonanywhereサービスの細かい内容や登録方法などはググってみてください。

いろんなサイトに最初にTokenを取得しろと書いてありますが、これはサイトへの接続テストをするくらいで、実際のデプロイで使うことはありませんでした。でも取得せよと軒並み書いてあるのでとりあえずとっとく。

Djangoの環境設定(特にDEBUGモードの設定による振る舞いの違い)についても最低限の知識は事前にゲットしたうえでローカルで動くDjangoのソース群の準備は大前提です。

それからgithubから資源をアップロードするので、まずはそちらのアカウントを取得したのち資源をプッシュしておいてください。githubがよくわからん人はそっちも先に調べててくだされ。

ちらりとLinuxコマンドも使いますので、一番基本的なコマンドが書いてあるサイトを見つけておいてください。

サイトによっては「仮想環境を作って」などと書いてるけど、仮想環境を作らなくても動きます。設定項目が増えるので、めんどくさい人は仮想環境を作らなくても大丈夫(めんどくさいし、トラブった時の問題解決をシンプルにしたかったからワシは作らずにやりました)

f:id:tonytani37:20210620071053p:plain

Pythonanywhereのダッシュボード画面です。ここからいろんな機能に飛んだりできますね。

以下、「」で囲んでいるのはPythonanywhereが提供する機能名です。

で、まずやることは「Web」からメニューに沿ってdjangoで動く環境を作ること。そうすると上のロケットが出てくる画面が表示できるところまでできる。

次に「Console」でgithubリポジトリをクローンする。これについてはpythonanywhereというライブラリをインストールして、コマンドを叩けばいいと書いてあるサイトも多いんだが、ワシの場合はそれだとなんだかうまくいかなかったということもあって、素直にgithubからクローンしてやったぜ。

”git clone https://github.com/自分のユーザ名/リポジトリ名” と入力して実行するだけ

(https://以降は開いている自分のリポジトリのURLをコピペすればオーケー)

f:id:tonytani37:20210620071629p:plain

Consoleは普通のBashなので、怖がらずにコマンドを打っちゃってください。ディレクトリ間違えて実行しているのは見て見ぬ振り。

そうすると自分のPythonanywhereの環境にリポジトリ名が付いたフォルダが作成され、その下に資源がアップロードされます。

f:id:tonytani37:20210620010647p:plain

今回はdockerで動かしてみた時のリポジトリをそのまま使いました。nginxという名前は、Webサーバにnginxを使ってたからわかりやすいと思って付けただけです。mysite/というのは、WSGIファイルの設定を楽にするためにPythonanywhereで作ったダミーのDjangoプロジェクトです。こいつは自分のソースで動き始めたら消してもオーケー

f:id:tonytani37:20210620010824p:plain

nginx/配下はこんなかんじ。ここにもテスト用やdocker用に作ったときの名残がたくさん残ってます。

Pythonnaywhereにソースをアップロードできたら、次にやるのがソースの保存場所の指定。「Web」にあるメニューからなので簡単だけど、パスの参照ができないからすべて手で登録する必要あり。

f:id:tonytani37:20210620011121p:plain

パス指定はすべて手入力なので間違えないように

次に行うのが上の画面にある"WSGI.configuration file"という部分。リンクをクリックするとWSGIの設定ファイルが表示されるので修正しましょう。

WSGIについてはすでにダミーサービス用に作成されているので、そいつの中の二箇所を修正すればオーケー。

自分のプロジェクトが保存されているフォルダ名と、setting.pyがある場所を指定します。

WSGIとはなにか?と疑問に思った人は、自分でググってください。ワシも詳しいことは知らんから、ちょっとだけでもエラくなったらワシに教えて下さい。

f:id:tonytani37:20210620011917p:plain

修正は二箇所のみです。この時点でmysite/は不要なので削除しても問題ない(はず)

 あとはmediaフォルダとかstaticフォルダとかを「Web」から必要に応じて指定してください。mediaやstaticフォルダの指定に合わせてsetting.pyも直す必要があるかと思ったけど、関係ないみたい(不確かな情報)です。そんなカンジなので、view.pyでダイレクトにパス指定などしている場合にはバグ発生となるかもしれませんので、テストはきっちりやるように。

で、setting.pyといえば接続を許可するURLやアドレスの指定が必要ですが、それについては

 "ユーザ名.pythonanywhere.com"

と、サービスへアクセスするURLをそのまま指定すればオーケーです。

よくわからん人は、ダミーで作ったmysite/配下にあるsetting.pyのALLOWED_HOSTS行に書いてあるそのままをコピーすればオーケー。

f:id:tonytani37:20210620012506p:plain

DEBUG = False にしとく。

ここまで準備したら「Console」からDjangoを初めて動かすときのおまじないであるマイグレーションを実行するんですが、python3 manage.py migrateはローカルと比べて処理時間がかかるので我慢して待ちましょう。またローカルのデーターベースで動かした実績がある資源をそのままアップしてmigrateしたときにエラーが表示される場合、migrateディレクトリに保存されているmigrate履歴ファイルを削除すればいいですよ。

もういっこDjangoの本番デプロイ時にやれと書いてあるstaticファイルを本番用指定フォルダにまとめるPython3 manage.py collectstaticなんですが、「Web」から実行環境に合わせてstatic/のパスを指定しておけば、実行しなくても動きました。(setting.pyのstatic指定が開発環境のままでも動いた理由はここらへんにあるかもしんない)

 

f:id:tonytani37:20210620012634p:plain

なにか修正したら緑のリロードボタンを押すのは必須

ここまでできればあとはリロードボタンを押して変更を反映させた後に、自分のサイトにアクセスしてみましょう。「Web」のConfiguration forの右側のリンクをクリックすると自分のサイトへ飛べます。

f:id:tonytani37:20210620012842p:plain

これで完成。これこそあなたがアップロードした「あなたの画面」です それにしても練習用とはいえ色気がないデザインの画面だな。

事前にユーザ登録が必要な場合は、「Console」からpython3 manage.py createsuperuserでadminユーザを予め作っておく必要がありますね。

これでおしまい。うまくいくはず。エラー画面が出てきたら、それはなにかの設定がおかしいので、定番の手順どおりにsetting.pyのDEBUGをTrueにして、画面に表示されるエラーメッセージを見ながらぼちぼち直してゆきましょう。

特に書かなかったんですが、Djangoを始め必要なライブラリは個別に「Console」からインストールしなければならないっぽいです。(ワシの場合は色々やってたら勝手にインストールされたっぽいので、どこまでやるべきかがよくわからない)もし動かなかったらそっちも疑え。とりあえずインストールしてみろ。なおPythonanywhereではPython2も使えるっぽいので、PiPやPythonを使う場合にはバージョン3を明示して実行する必要があります(と思います)。例えばpip3 installとかpython3 manage.pyとか。

ちなみにDBは無料サービスとしてMySQLが使えますが(PostgreSQLは有料)、SQLite3でも問題なさげでした。Herokuの無料ユーザ環境では定期的にファイルが消されるらしいので、使うな(その代わり無料のPostgreSQLが使える)と言われてましたが、Pythonanywhereでは(3ヶ月程度過ぎると消されるみたいだけど)Herokuみたいにすぐに消えることはないみたいです(未確認事項)

 

それではみなさん、これからも楽しいPythonライフを!