出典:【Python】FlaskでWebアプリケーションを作る
■1:基本 sample解説
#pip install flask flaskのインストール
#pip list flaskの有無、バージョン確認
from flask import Flask
app = Flask(__name__)
#↑Flaskクラスのインスタンスを作成
#FlaskではHTMLやJavaScriptのファイルを格納するフォルダ構造が決まっており、
#それらの場所を把握するために、どのスクリプトでWebアプリケーションのコアとなる
#Flaskオブジェクトが作成されたという情報が必要なので、引数として特殊な変数の
#__name__を渡す。__name__がスクリプトから呼出されたら自身のモジュール名
#(ファイル名)が格納される(引き渡される)。
#↓routing/reply when access to http://127.0.0.1:5000
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
# ↓routing/reply when access to http://127.0.0.1:5000/hoge
@app.route("/hoge")
def hoge_hoge():
return "<p>hoge, hoge!</p>"
if __name__ == "__main__":
app.run(debug=True)
#↑app.run()によりアプリケーションを起動。
#開発用サーバで起動する場合、debug=Trueでリクエスト処理中のエラー内容をブラウザに表示
■2:FLASKにおけるディレクトリ構成(必要最小限)
sample_app
│
│ main.py
│ requirements.py #アプリケーションで必要なライブラリの一覧を記載
│ settings.py #共通項目を定義。DB接続情報、環境変数、その他プログラムから外出しで管理すべき値を格納
│
├─common
│ └─models #DBの接続処理やテーブル定義、CRUD操作に関するスクリプトを管理
│ models.py
│ crud.py
│
├─controllers #アプリケーションの実際の処理。機能ごとにファイルを分けるのが一般的
│ index.py
│ sample.py
│
├─static #JavascriptやCSS、画像ファイルといった静的ファイルを格納。ディレクトリ名称は原則デフォルト
│ index.css
│ sample.css
│
└─templates #HTMLファイルを格納。ディレクトリ名称は原則デフォルト
index.html
sample.html
■3:ルーティング(クライアントのリクエスト内容とサーバでの処理を紐づけ)
#ルーティングのサンプル(★FLASKの基本形)
from flask import Flask
from flask import request
print(__name__)
app = Flask(__name__)
#基本:ルーティングは@app.route()で制御
@app.route("/")
def main_page():
return "<p>This is the main page</p>"
@app.route("/hello")
def hello():
return "<p>Hello World!</p>"
#URLの中で処理に対して引数を渡す。jobが変数の例
@app.route("/yourJob/<job>")
def show_user_profile(job):
return "Your Job: " + str(job)
#POSTメソッドで通信する場合、下記指定をしないとエラーとなる
#↓HTTPメソッド(この場合はGETとPOST)を許可
@app.route("/http" , methods=['GET', 'POST'])
def http():
if request.method == 'POST':
return "<p>POST</p>"
elif request.method == 'GET':
return "<p>GET</p>"
else:
return "<p>Anything else</p>"
if __name__ == "__main__":
app.run()
■4:画面のHTML表現
#画面はHTMLで記述。
#Flaskのソースコードに直接HTML形式で記述できるが、HTMLファイルを読込む制御も可能
#FlaskのスクリプトはWebアプリ処理制御が目的のスクリプトのため、HTMLを埋込んでしまうと
#コードの可読性が著しく低下してしまう。
from flask import Flask, render_template
print(__name__)
app = Flask(__name__)
@app.route("/")
def main_page():
return "<p>This is the main page</p>"
@app.route("/htmlFile")
def html_page():
return render_template('index.html')
#↑”templates/xx.html”のようなディレクトリ指定は必要ない。
#templates以外のフォルダでテンプレート(HTMLファイル)を管理したい場合は、app = Flask(__name__)に以下のように引数を追加する。
#app = Flask(__name__, template_folder='フォルダ名')
if __name__ == "__main__":
app.run()
#読み込むHTMLファイル(ファイル名:index.html)(保存場所:templatesフォルダ)
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>HTML Sample</title>
</head>
<body>
<div class="main">
<h1>
</h1>
<p>HTMLから読み込んだで</p>
</div>
</body>
</html>
■5:GETメソッドでのリクエストに応じてデータベースから取得したPandasテーブルを画面表示
★★★コード変更は終わっていない230731。そのままでは動かない。コード参考まで!!!
from flask import Flask, render_template, request
#import psycopg2
#↑元サンプルコードはpostgreSQLを適用していたが、標準ライブラリのあるSQLiteを使う。
import sqlite3
import pandas as pd
app = Flask(__name__)
# PostgreSQLへの接続
#conn = psycopg2.connect(
# user="xxxx", #ユーザ
# password="xxxxx", #パスワード
# host="localhost", #ホスト名
# port="5432", #ポート
# dbname="dvdrental") #データベース名
# SQLiteへの接続
#SQLiteDBファイルのパス
path_DB = 'C:\Users\shienkikou11\Desktop\VSCode\FLASK_test/企業情報DB_V1.1.db'v
# DBに接続
conn = sqlite3.connect(path_DB)
#Cursorオブジェクトを取得
cur = conn.cursor()
#@app.route('/')
#def get_version():
# cur = conn.cursor()
# cur.execute('SELECT version()')
# version = cur.fetchone()[0]
# return f'PostgreSQL version: {version}'
@app.route('/')
def get_version():
version = conn.execute('select sqlite_version()').fetchone()
return f'SQLite version: {version}'
#GETメソッドでパラメータを受取、そのパラメータ値でのDB検索結果をテーブル形式でHTMLに渡し、画面に表示
@app.route('/result', methods=["GET"])
def result():
# GET送信の処理
user_id = request.args.get("user_id","")
print(user_id)
sql = "select * from payment where customer_id='{}'".format(user_id)
#PandasでSQLでDBから結果取得し、Pandasデータフレームに格納
df = pd.read_sql(sql, conn)
#データフレームをHTML形式に変換するdf.to_html()の結果をHTMLの変数tableに渡す
return render_template('result.html', table=(df.to_html(classes="mystyle")))
if __name__ == '__main__':
app.run(host='localhost')
#result.html・・・保存場所:templatesフォルダ
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>mystyle</title>
<style type="text/css">
body {
font-family: Arial, Verdana, sans-serif;
font-size: 90%;
color: #666;
background-color: #f8f8f8;}
</style>
</head>
<body>
<h1>支払情報</h1>
{{table | safe}}
</body>
</html>
■6:グラフ表示・・・当面、使わない。
■7:GETとPOST
7-1:GET
・GETはURLにデータを含めて送信。データはURLの末尾付加。
・例:
http://example.com/search?q=keyword
q=keywordがデータ。
・GETはWebページを取得する等データを取得する場合に用いる。
このときのデータには表示したいページ番号等の情報が入いる。
7-2:POST
・POSTはHTTPリクエストボディにデータを含めて送信。
例:
POST /search HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
q=keyword
・ログイン情報や、入力フォームの情報を送信する場合に用いる。
7-3:FLASKでの使い方
例:
from flask import Flask, request
app = Flask(__name__)
# GETリクエストを受け取る関数
def get():
name = request.args.get('name')
return 'Hello, GET, {}!'.format(name)
# POSTリクエストを受け取る関数
@app.route('/', methods=['POST'])
def post():
message = request.form.get('message')
return 'Message: ' + message
if __name__ == '__main__':
app.run()
・GETを確認するには、ブラウザでcurl -X GET http://localhost:5000/?name=naoにアクセスします。
curlを使う場合は以下コマンドを実行(コマンドプロンプト等で実行)。
”Hello, GET!”というメッセージが返ってくればOK。
curl -X GET http://localhost:5000/?name=nao
>> Hello, GET, nao!
・POSTの確認はcurlにて行う。以下のコマンドを実行。
curlでPOSTにおけるデータを付与するには、-dパラメータを用いる。
curl -X POST -d "message=Hello, Flask!" http://localhost:5000/
>> Message: Hello, Flask!