IT(主にPython)と子育て情報を発信中。

だんにこブログ

【初心者向け】Python+Flaskで初めてのWebアプリ開発

2021年2月16日

想定読者:PythonでWebアプリ開発をやってみたいけど、どうやっていいかさっぱりわからない。PythonとHTMLで作れる機能や作り方が知りたい。初心者向けに細かい解説などもはさんでやってほしい。

 

こんにちは。だんにこ(@dannikosu)です。

 

今回はPythonとFlaskを使って、Webアプリ開発をやってみようと思います。初心者向けなので、なるべく解説を入れつつ進めていきます。これからWebアプリ開発をしたい方用に進めさせてもらいますので、実際に手を動かしながら実践してみてください。

 

僕は業務内ですが、小規模のシステムを1人で作成経験があります。その時はFlask+MySQL+HMTL+CSS+Javascriptを使って作成し、勉強や調べ物をしながらなので3か月くらいかかりました。今回はその経験も生かして、解説していきます。 またPython関連の記事は以下になるので、気になる方はチェックしてみてください。

PythonフレームワークのFlaskとDjangoを比較解説

Webシステムを作りたいけど、どうやっていいかわからない。Pythonはわかったけど、Webシステムのフレームワークがどんなものがあるか知りたい。あとどれがオススメなのかも教えてほしい。 こんにちは。 ...

続きを見る


Windows10でPythonインストール【インストール不要】

こんにちは。だんにこ(@dannikosu)です。   本記事では、以下のような方向けに記事を書いています。 会社でPythonを使うことになったから勉強しないと…。 副業のため、新しくプロ ...

続きを見る

 

※自宅で学習できる0円のプログラミングスクールという近道
エンジニアの僕がおすすめするオンラインでしかも無料で学習できるプログラミングスクールをまとめてみました。独学に限界を感じ始めている方はオンラインプログラミングスクールおすすめですよ。

無料:自宅でできるエンジニアおすすめのプログラミングスクール5社

プログラミングスクールに行きたいけど、どんなプログラミングスクールがいいかわからない。料金もどこも高くて払えないよ。なるべく安いところを紹介してほしい。あとコロナで外出できないし、家から自分のペースで ...

続きを見る

 

Python+Flaskで初めてのWebアプリ開発

テキストエディタのインストールこれから実際にプログラミングを書いていくのですが、プログラムを作成するツールが必要になります。メモ帳でもいいんですが、文字に色が付いたり見やすいほうがプログラミングがはかどると思います。そこで、テキストエディタをインストールするのをお勧めします。テキストエディタもいろいろな種類があって、どれを選んだらいいか迷うと思います。そこで僕が使っているVisual Studio CodeSublime Textの2つをご紹介します。

 

 Visual Studio Code

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

  • マイクロソフト社が開発しているエディタ。
  • 誰でも無料で使える。
  • WindowsやMac、Linuxなどにも対応。
  • 多くのプログラミング言語に対応。
  • 拡張機能で好きな機能を追加可能。

 

上記のような特徴があります。マイクロソフトが開発しているという面で安心感がありますね。ネームバリューがありますから。あとは無料。やはり無料は最強ですからね。ただのものは使っちゃいましょう。 デメリットは少し慣れるまで操作が難しい点があるかもしれません。でも慣れてしまえばメモ帳よりはるかに動作が早くなりますし使いやすいと思います。慣れるまでが一番の頑張り時なので、一緒に乗り越えましょう。

 

 Sublime Text

http://www.sublimetext.com/3

  • 誰でも無料で使える。※ライセンス版もあり
  • WindowsやMacで使用可能。
  • 動作が非常に軽い。
  • 多くのプログラミング言語に対応。
  • 拡張機能で好きな機能を追加可能。
  • 最初は英語なので日本語化にする必要がある。

 

Visual Studio Codeに比べて圧倒的に軽い動作が見込めます。あと見た目がシンプルなので、とても使いやすいです。逆を言えば、必要最低限の機能しなかないので、自分でカスタマイズが必要です。あと無料版を使っていると、ライセンス版への誘導ウインドウがたまに出て来ますが、そんなに気にしなくても使用できるレベルです。

 

僕はSublimeTextを使っています。カスタマイズは少し大変ですが、カスタマイズも終われば、とても扱いやすいテキストエディタです。またこれを機にテキストエディタについても調べてみてください。

 

初めてのWebアプリ開発

では本題です。これからはWindows10を想定に話を進めていきます。別のOSの方は読み替えてください。まずは初めてのWebアプリということで、PythonとFlaskを使ってWebブラウザに文字列を表示させましょう。

 

 Flaskインストール

まずはコマンドプロンプトで以下を入力してください。
[crayon-67418abba9d58334260889/]
 

 データを保存するフォルダを作成

こちらは任意です。好きなフォルダを作ってもらっても大丈夫です。Cドライブに直接フォルダを作ったほうが必要以外触らないので安全かなと思い、以下のようにしております。フォルダ場所はお任せします。
[crayon-67418abba9d5c059820629/]
 

 フォルダ、ファイル構成

作ったデータ保存場所に以下のようにproject1フォルダの中にhello.pyを作成してください。
[crayon-67418abba9d5d555225426/]
 

 アプリの構築

hello.pyの中身です。テキストエディタで開いて、以下のように入力してください。
[crayon-67418abba9d5e591670012/]
以下はプログラムの解説になります。

 
[crayon-67418abba9d5f766382861/]
Flaskをインポートしています。Pythonではインストールしたものはインポートしないと使えないので、忘れずにインポートしましょう。

 
[crayon-67418abba9d60491384471/]
Flaskクラスのインスタンスを作って、appという変数に代入しています。変数に入れることで後々でプログラムが簡潔になるためです。

 
[crayon-67418abba9d61923852845/]
ルートページの内容を記入していきます。ルートページとは作成するページの一番上位のページです。今回作成するページのaddressはhttp://127.0.0.1:8888/ですが、このページにアクセスしたのがルートページでこの下にどんどんページ内容を追加していきます。

 
[crayon-67418abba9d62555723914/]
ルートページ内に関数を作成しています。単純に文字列を返す関数です。

 
[crayon-67418abba9d63977016752/]

  • host → 作成するページのアドレスです。
  • debug → デバッグモード。オンにするとアクセスしたときに何か不具合があれば表示してくれる機能です。
  • port → 作成するページのポート番号です。URLの後ろのほうで使います。
  • threaded → 作成したサイトに同時アクセスを可能にするかを指定します。

 

 アプリ起動

作成したアプリをコマンドで立ち上げます。コマンドプロンプト上でデータ保存フォルダに移動して、
[crayon-67418abba9d64832382993/]
もしくは、
[crayon-67418abba9d65798551408/]
を実行してください。すると、

上記画面で止まりますので、その後サイトにアクセスします。

 

 サイトにアクセス

インターネットブラウザでhttp://127.0.0.1:8888/にアクセス。

 

 結果

上記画面が表示されたら、正常に動作しています。

 

ちょっとホームページっぽくする。(テンプレートの使用)

次はHTMLファイルと連動させて、ちょっとホームページっぽくします。

 

 Jinja2インストール

テンプレートを使用するには、jinja2のインストールが必要です。
[crayon-67418abba9d66220349272/]
 

 フォルダ、ファイル構成

アプリファイル(hello.py)と同じところにtemplatesフォルダを作り、その中にhtmlファイルを入れるのが決まり。フォルダ構成を間違えないでください。
[crayon-67418abba9d67266144194/]
 

 アプリの構築
[crayon-67418abba9d68338321919/]
以下で部分的に解説をします。

 
[crayon-67418abba9d69340948831/]
render_templateを追加。

 
[crayon-67418abba9d6a981712772/]
render_templateを使って、戻り値をhtmlへ変更。

 
[crayon-67418abba9d6b301728539/]
 

 アプリ起動

作成したアプリを以下のコマンドで立ち上げます。前回と同様ですね。
[crayon-67418abba9d6c616233174/]
 

 サイトにアクセス

http://127.0.0.1:8888/にアクセス。

 

 結果

上記画面のように、htmlファイルの中身が表示されれば、成功です。

 

テンプレートエンジン Jinja2

 Jinja2使い方

先ほど、Jinja2をインストールしましたが、もう少し踏み込んだ使い方をお伝えします。

  • {% ... %} → ステートメント。if文やfor文を囲う。
  • {{ ... }} → 式や変数などを入れる。
  • {# ... #} → コメント。

上記のものを使用することで、HTML上にPythonで定義した変数を使ったり、HTML上でif文やfor文が使用できます。

 

 フォルダ、ファイル構成
[crayon-67418abba9d6d515971176/]
前回と同じです。

 

 アプリの構築
[crayon-67418abba9d6e184340260/]
以下で部分的に解説をします。

 
[crayon-67418abba9d6f517777638/]
Python上にHTMLで使用する変数を定義します。

 
[crayon-67418abba9d70270970835/]
render_templateの第2引数以降、html用の変数と紐づけします。例えば、a1=array1はa1がHTMLの変数名で、array1はPython用の変数名です。

 
[crayon-67418abba9d71708628054/]
今回のHTMLでは、

  •  {% ... %} → ステートメント。if文やfor文を囲う。
  •  {{ ... }} → 式や変数などを入れる。

こちらの使い方の例を表示しています。

 
[crayon-67418abba9d72383114164/]
{{ 変数名 }}の形で使用しています。

 
[crayon-67418abba9d73824741874/]
{% for %}
{{ 変数名 }}
{% endfor %}
の形で使用しています。 for文を使うことで、配列に入っている要素すべて表示が可能です。

 

 アプリ起動

作成したアプリを以下のコマンドで立ち上げる。
[crayon-67418abba9d74076708384/]
 

 サイトにアクセス

http://127.0.0.1:8888/にアクセス。

 

 結果

プログラムで使うif文やfor文をHTMLで使用することで、データを全部表示することができます。PythonファイルとHTMLファイルをよく見比べて、どういう流れでデータが移動しているかを確認してみてください。

 

HTMLを分割できる(レイアウト)

HTMLの最初と最後は他のページでも被る部分があります。重複をなくすために、同じところを一つにまとめようというのが今回の機能です。

 

 フォルダ、ファイル構成
[crayon-67418abba9d75083968508/]
 

 アプリ構築
[crayon-67418abba9d76717534719/]
今回のPythonファイルに関しては特に変わったことはしていないので、説明は割愛します。

 
[crayon-67418abba9d77435225076/]
以下で説明します。

 
[crayon-67418abba9d78244446533/]
ここでレイアウトファイルを指定します。

 
[crayon-67418abba9d79624654540/]
これでHTML本体の内容を挟みます。

 
[crayon-67418abba9d7a490354886/]
以下で解説です。

 
[crayon-67418abba9d7b300256140/]
上記の通り、layout.htmlでは実際にhello.htmlが入る部分を

 
[crayon-67418abba9d7c581586281/]
これで囲みます。

 

 アプリ起動

作成したアプリを以下のコマンドで立ち上げる。
[crayon-67418abba9d7d878606520/]
 

 サイトにアクセス

http://127.0.0.1:8888/にアクセス。

 

 結果

 

HTMLページ追加、画面移動

HTML上でほかのページに移動できるようにしましょう。

 

 フォルダ、ファイル構成
[crayon-67418abba9d7e696966816/]
 

 アプリ構築
[crayon-67418abba9d7f892107011/]
以下で解説です。

 
[crayon-67418abba9d80382753719/]
1ページ目になります。いわゆるルートページ。アドレスはhttp://127.0.0.1:8888/です。

 
[crayon-67418abba9d81961624288/]
2ページ目です。アドレスはhttp://127.0.0.1:8888/page2です。

 
[crayon-67418abba9d82065749015/]
[crayon-67418abba9d83780741859/]
page1とpage2はlayout.htmlを使って作成しています。ページ移動できるようにそれぞれのページにボタンを追加しています。

 

※layout.htmlは以前と同じです。

 

 アプリ起動

作成したアプリを以下のコマンドで立ち上げる。
[crayon-67418abba9d84677904608/]
 

 サイトにアクセス

http://127.0.0.1:8888/にアクセス。

 

 結果

page1

page2

 

ログイン機能

ログイン機能を追加するために、flask-httpauthをインストールする必要があります。

 

 flask-httpauthをインストール
[crayon-67418abba9d85891378746/]
 

 フォルダ、ファイル構成
[crayon-67418abba9d86828739682/]
 

 アプリ構築
[crayon-67418abba9d87387953413/]
以下で解説です。

 
[crayon-67418abba9d88883035753/]
import文でflask_httpauthを追加します。

 
[crayon-67418abba9d89949249280/]
authインスタンスを作成します。パスワード認証関連のインスタンスです。

 
[crayon-67418abba9d8a007048777/]
ユーザーリストとパスワードリストを作成。簡単なデータベースを作成するイメージです。

 
[crayon-67418abba9d8b812324648/]
パスワードを確認する関数。パスワードを受け取った時に、入力されたユーザーネームがユーザーリストに入っていれば、ユーザーネームを返すという流れです。もし入力されたユーザーがユーザーリストに入っていなければ、何も入っていないNoneを返します。

 
[crayon-67418abba9d8c848709607/]
パスワードを確認したいページに@auth.login_requiredを追加します。今回はメインページに追加しています。

 
[crayon-67418abba9d8d283384491/]
ログインエラー時のページ部分です。

 
[crayon-67418abba9d8e922634344/]
ログアウト時のページ部分です。

 

※layout.htmlは以前と同じです。

 
[crayon-67418abba9d8f895459001/]
[crayon-67418abba9d90088714130/]
[crayon-67418abba9d91117180913/]
同じくlayout.htmlを使用して、それぞれのページを作成しています。

 

 アプリ起動

作成したアプリを以下のコマンドで立ち上げる。
[crayon-67418abba9d92050670567/]
 

 サイトにアクセス

http://127.0.0.1:8888/にアクセス。

 

 結果

ログイン画面

 

ログイン成功ページ

 

ログイン失敗ページ

 

ログアウトページ

 

まとめ:千里の道も一歩から

初めてのWebアプリ開発どうでしたか。うまく動作しましたか?動作しない場合はよく見比べてみてください。また動作しても、なんでこのプログラムでこのWebページが表示されるのかとかもっと疑問を持ったり、興味を持つことが上達の近道だと思っています。少しずつプログラムというものに興味を持って自分のペースで無理せず進めてみてください。

 

それでは、また。

 

※自宅で学習できる0円のプログラミングスクールという近道
エンジニアの僕がおすすめするオンラインでしかも無料で学習できるプログラミングスクールをまとめてみました。独学に限界を感じ始めている方はオンラインプログラミングスクールおすすめですよ。

無料:自宅でできるエンジニアおすすめのプログラミングスクール5社

プログラミングスクールに行きたいけど、どんなプログラミングスクールがいいかわからない。料金もどこも高くて払えないよ。なるべく安いところを紹介してほしい。あとコロナで外出できないし、家から自分のペースで ...

続きを見る

 

  • B!