出典:【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!