Nginx — Gunicorn — Django
前回の記事ではNginxとDjangoでWeb上にメッセージを表示できるようにした。
最終的な構成は
Nginx — Gunicorn — Django
なので今回はGunicornを実装していく。
pip3(もしくはpip)でgunicornをインストールし、manage.pyがあるディレクトリの階層で以下を実行
$ gunicorn --bind 127.0.0.1:8000 mysite.wsgi -D
もうこれだけでDjangoを動かさなくてもアクセスするとページが表示されている。チョー簡単!
「食べログマッピング」のサービスのweb(限定)公開
ということでお次は本題「食べログマッピング」のサービスをweb公開できるかやってみた。
その過程でプチハマりした部分を備忘録として共有しておきたい。
食べログのマッピングサービスの構築は以下の3回に分けて記事に書いてあるので興味があれば読んで欲しいです。
対応した課題(1): 「CSRF検証に失敗したため、リクエストは中断されました」エラー
Django起動し、ページをブラウザから確認しようとした際にブラウザで確認されたエラー。
アクセス禁止 (403) CSRF検証に失敗したため、リクエストは中断されました。 Help Reason given for failure: Origin checking failed - https://xxxxxxxxxxx does not match any trusted origins. In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django’s CSRF mechanism has not been used correctly. For POST forms, you need to ensure: • Your browser is accepting cookies. • The view function passes a request to the template’s render method. • In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL. • If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data. • The form has a valid CSRF token. After logging in in another browser tab or hitting the back button after a login, you may need to reload the page with the form, because the token is rotated after a login. You’re seeing the help section of this page because you have DEBUG = True in your Django settings file. Change that to False, and only the initial error message will be displayed. You can customize this page using the CSRF_FAILURE_VIEW setting.
調べると、htmlに {% csrf_token %}が無いから追加しろという内容の記事が出てくるが、実際 {% csrf_token %}はあるのに上記エラーが発生したため、戸惑った。
これはDjangoのsetting.pyに以下の行を追記すると解消される
CSRF_TRUSTED_ORIGINS = ['https://ドメイン名']
参考はこちら
対応した課題(2): 「Errcode: 13 “Permission denied”」エラー
mariaDB内で以下SQLを実行した際に発生。
LOAD DATA INFILE '{csvのpath}' INTO TABLE `mytable` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;
これに関しては「LOAD DATA INFILE」でなく、「LOAD DATA LOCAL INFILE」にすると解決する。
なので以下のように変更すると解決。
LOAD DATA LOCAL INFILE '{csvのpath}' INTO TABLE `mytable` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 L
対応した課題(3): 「csvファイルをMariaDBにインポートしたのにデータがtableに入っていない問題」
以下のように実行するとエラーは出ないものの、0 rowとなっており、データがテーブルに入っていない状態になる。
MariaDB [test_db]> LOAD DATA LOCAL INFILE '{csvファイルのpath}' INTO TABLE `test_table` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;
Query OK, 0 rows affected (0.001 sec)
Records: 0 Deleted: 0 Skipped: 0 Warnings: 0
これは「LINES TERMINATED BY ‘\r\n’」の部分を除くとデータがtableに入っているのを確認できた。(こんなん分かるか)
なぜかはまだ調べ中。
以下のようにうまくデータが入る。
MariaDB [django_db]> LOAD DATA LOCAL INFILE '{csvファイルのpath}' INTO TABLE `test_table` FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES;
Query OK, 3 rows affected (0.001 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
MariaDB [django_db]>
MariaDB [django_db]> SELEcT * FROM test_table;
+-------+-------+-------+-------+
| test1 | test2 | test3 | test4 |
+-------+-------+-------+-------+
| 1 | 2 | 3 | 4 |
| 1 | 2 | 3 | 4 |
| 1 | 2 | 3 | 4 |
+-------+-------+-------+-------+
3 rows in set (0.001 sec)
…以上を踏まえて以下のようにウェブブラウザから外(Djangoが動いているサーバ)にアクセスして起動まで確認できた。
(ちなみに)このサービスはログインしないと見れない仕様
ちなみにこのサービスはログイン機能も付けていてユーザ名とパスワードを入力しないと入れない仕様にしている。
ユーザ名とパスワードはDjangoのadminから登録が可能。
そしてこのログイン機能を実装するに際して、参考にしたサイトは以下のサイト。
【Django】ログイン機能の実現方法(関数ベースビュー編) | だえうホームページ (daeudaeu.com)
本当に丁寧に書かれていて、実装するだけでとても勉強になる良記事なのでぜひ読むことをお勧めしたい。
一旦、払い出しをできてみての所感
この払い出せたのが2022年12月31日。
食べログの値をスクレイピングし始めたのが今年の8月でさくらvpsにサービスを払い出せたのが12月なので約4か月でサービスを出せたことになる。
これは速いのか遅いのかは分からない(おそらく遅いと思う)。
しかし以前も書いた通り、開発において時間がかかるのはエラーと格闘する時間。
だから次はもっと短く開発できるのではと思っている。
今年中には払い出したい。
ただ、2022年内に切り良いところまで進めたのは心地が良い。
一日少しでも実績を残していくことが大事
開発が一区切りついたところで大事だと思う事を書きたい。
今回の開発も含めてだが、その日1日で1つでも前進することが大切。
例えば、小さな機能を1つ実装したり、エラーを1つ解消したり、リファクタリングを1つの箇所してみたり。
なにか1つでも前進することがとにかく大切。
特に今回の開発は自分の本業とは別に実装しているものなので、仕事が忙しいと嫌になりがちなのだが、忙しい時はほんの小さな前進でもよいのですることが大切。
小さな積み重ねが自分の能力も向上させるので最終的に開発が完了するのが早くなる。