LoginSignup
2
1

More than 3 years have passed since last update.

pythonでのWebアプリケーション開発メモ

Last updated at Posted at 2021-01-07

はじめに

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を編集する際の手順としては以下の通り。

  1. modelを書く
  2. python manage.py makemigrations アプリ名の実行
  3. 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において、「ブラウザからのリクエストを元に、表示させるページ/データを取得して、レスポンスを生成する」機能を担っている

そしてdjangoにはユースケースに応じて適切なデフォルト値を設定しておいてくれる、「汎用ビュー」と呼ばれる機能がある

汎用ビューの種類の使い分け方法は以下を参照

今回はWebページが入力したデータを元にスクレイピングを走らせたいので、formを使えるCreateViewを利用する。

reverse/reverse_lazy関数について

CreateViewsuccess_url変数(作成成功時に遷移するページのURL)を指定する時は、reverse_lazyと呼ばれる関数を利用する。

reversereverse_lazyという関数は「名前を指定してurlを呼び出す」際に利用される。

具体的に言うと、reverse('home')とした場合、urlpatternsでname='home'と指定したurlを呼び出す。

reversereverse_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における比較演算子

- 参考記事:比較演算子の使い方

「等しい」が=ではなく==であることを忘れがち

pythonにおけるreturn文

リストを返却したければ、return [aaa,bbb]のような形で書けばよい。

pythonにおける関数の使い方

基本的だけど重要な話。

pythonにおけるデータの型

色々あるから、使いながら覚えていこう。

辞書型

辞書に新しい要素を追加する場合は、辞書オブジェクト[キー] = 値で実現出来る

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1