はじめに
pythonでスクレイピングを学んだ後に、取得したデータを利用したWebアプリケーションを作りたくなったので、実現方法を調べたメモです。
どのフレームワークがよいか?
Djangoというフレームワークがおススメとのこと。
Djangoの詳細はこちら。
Djangoのインストール方法
以下を参照した
【Django入門】あなたのパソコンにDjangoをインストール!
$ pip install django
を実行しようとしたところ、pip自体のバージョンが古いと言われ、アップデートする必要があった...
Git Bashで$ python
でpython shellを起動しなかった。
なんか仕様らしい...
pythonはGit Bashで扱わない方がよさそう(大人しくコマンドプロンプトで実行)
プロジェクトとアプリケーションの作成
プロジェクト作成のコマンドは以下
django-admin startproject mySite
テンプレート作成のコマンドは以下
python manage.py startapp myapp
modelという機能を利用することで、DBを直接触らなくてもデータベースをいじれるらしい(3階層構造のアーキテクチャで作りたかったので、DBを簡単に操作できるのはありがたい)
modelを編集する際の手順としては以下の通り。
- modelを書く
-
python manage.py makemigrations アプリ名
の実行 -
python manage.py migrate
の実行
modelの使い方
templateの利用方法
まず、settings.py
ファイル内のTEMPLATES
にある'DIRS'
以下の記述を追記する。
os.path.join(BASE_DIR, 'templates'),
これで「templatesというディレクトリにtemplateファイルを入れていくこと」を宣言している(らしい)。
その後templatesディレクトリを作った後にテンプレート表示処理を作る流れとしては
- view関数の定義
- URLとview関数の紐づけ(プロジェクトとアプリケーションそれぞfれで)
という感じ。
紐づけ終わったら
python manage.py runserver
のコマンドを実行すると、ローカルホストでサーバーを起動してテンプレートが表示されるかを確認出来る。
djangoのtemplateには色々な便利機能があるので、使ってみたいなと思った。
詳しくは公式ドキュメントを参照のこと。
{% csrf_token %}によるCSRF対策ついて
DjangoではデフォルトでCSRFの検証を行ってくれる。
CSRFとその対策に関する詳細は以下を参照のこと。
Webページに入力したデータを元に、スクレイピングを実行し、表示するまでの一連の流れ
参考記事:python:WEBアプリを作ろう(djangoでスクレイピング)
views.py
ファイルの中で色々と記述していくことになる
viewという概念
viewはMTV(Model, Template, View)という設計思想を採用しているdjangoにおいて、「ブラウザからのリクエストを元に、表示させるページ/データを取得して、レスポンスを生成する」機能を担っている
- 参考記事:MTVを理解しよう
そしてdjangoにはユースケースに応じて適切なデフォルト値を設定しておいてくれる、「汎用ビュー」と呼ばれる機能がある
汎用ビューの種類の使い分け方法は以下を参照
今回はWebページが入力したデータを元にスクレイピングを走らせたいので、formを使えるCreateView
を利用する。
reverse/reverse_lazy関数について
CreateView
のsuccess_url
変数(作成成功時に遷移するページのURL)を指定する時は、reverse_lazy
と呼ばれる関数を利用する。
reverse
やreverse_lazy
という関数は「名前を指定してurlを呼び出す」際に利用される。
具体的に言うと、reverse('home')とした場合、urlpatternsでname='home'と指定したurlを呼び出す。
reverse
とreverse_lazy
が何が違うかと言うと、「URLConf(=urls.py)を読み込む前にreverse
関数を利用する場合は、reverse_lazy
を利用する」みたい。
クラスの中で利用する場合は「URLConf(=urls.py)を読み込む前」に相当するらしいので、revese_lazy
を利用する。
遅延評価(lazy evaluate)を正しく理解するにはpythonにおいて何がどういうタイミングで評価されるかを理解する必要があるみたいだが、正直よく分からない...
pythonにおけるリストと要素追加方法
append()
関数を利用することで、既存のリストに単一の要素を追加できる。
extend()
関数を利用することで、既存のリストに複数の要素を追加できる。
※append
の引数にリストを入れると元のリストの中にそのままネストされてしまうことに注意!
extendを使えばそのままリスト内の要素として追加させる(ややこしい...)
render関数について
参考記事:
requestとテンプレートパスを渡すとそのテンプレートを使用したレンダリング結果をHttpResponseとして返してくれる関数。
第3引数に辞書型の値を渡すことで、templateに値を渡すことが出来る。
⇒これでappend
関数で辞書型のリストに突っ込んだ要素(スクレピングで取得したもの)をtemplateに渡し、HTML内の要素としてはめ込める
djangoにおけるmodelについて
- 参考:公式ドキュメント
modelクラスに対してはデフォルトで1つのManager
が追加されている。
- 機能:DB操作のためのインターフェイスを提供している
- 名前:
objects
(なんでmanagerではないのだろうか...?)
モデルマネージャーは色々なメソッドを持っている。
-
.objects.all()
:DB内の全ての要素を返却する -
.objects.filter()
:条件を指定して返却する
注意:モデルマネージャーが持っているメソッドを呼び出すには.objects
の記述が必須
参考:【初心者向け】Djangoのモデル操作でobjectsが必要な場合・不要な場合を理解する
pythonにおける条件文の書き方
- 参考記事:[Python入門]if文による条件分岐
基本的なことだが重要
pythonにおける比較演算子
- 参考記事:比較演算子の使い方
「等しい」が=
ではなく==
であることを忘れがち
pythonにおけるreturn文
リストを返却したければ、return [aaa,bbb]
のような形で書けばよい。
pythonにおける関数の使い方
基本的だけど重要な話。
pythonにおけるデータの型
色々あるから、使いながら覚えていこう。
辞書型
辞書に新しい要素を追加する場合は、辞書オブジェクト[キー] = 値
で実現出来る