Flask

環境構築

インストール — Flask Documentation (2.0.x)

% mkdir myproject
% cd myproject
% python3 -m venv venv

環境を有効化

% . venv/bin/activate

Flaskのインストール

% conda install Flask

起動

クイックスタート — Flask Documentation (2.0.x)

  • 以下を main.py でディレクトリに保存
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
  • 環境変数 main をエクスポート
% export FLASK_APP=main
  • 起動 flask run
    • ポート番号指定 -p 5000
    • ファイルリロード --reload
% flask run -p 5000 --reload

ルーティング指定

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

@app.route("/page1")
def page1():
    return "<p>page1</p>"

URL末尾のスラッシュ

  • @app.route() で指定するURL末尾のスラッシュ
    • つけると /foo でアクセスしても /foo/ にリダイレクトされて、スラッシュ有りでも無しでもアクセスできる
    • つけない場合はスラッシュ無しでしかアクセスできない
  • SEO の観点からは、付けない方がベター
@app.route("/foo/")   # /foo でも /foo/ でもアクセスできる
@app.route("/baa")    # /baa はアクセス可。/baa/ はアクセス不可

静的ファイル

  • css, js, 画像などは static に配置する
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
<script src="{{ url_for('static', filename='js/script.js') }}"></script>
<img src="{{ url_for('static', filename='img/flask-logo.png') }}" alt="">

テンプレートファイル

  • Flask にはテンプレートエンジン Jinja2 が含まれている
    • テンプレートは下記の様に templates フォルダに設置する
|_ file main.py
|_ templates
  |_ file main.html
  • テンプレートを変換するには render_template() メソッドを使用できる
  • テンプレート名 と、キーワード引数 としてテンプレートエンジンに渡したい変数を指定する
from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route("/")
def main(title='My Webpage'):
    return render_template('main.html', title=title)
  • テンプレートでは Jinja2 テンプレートの機能を全て使うことができる

Template Designer Documentation — Jinja Documentation (3.1.x)

<!DOCTYPE html>
<html lang="en">
<head>
    <title>{{ title }}}}</title>
</head>
<body>
    <ul id="navigation">
    {% for item in navigation %}
        <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
    {% endfor %}
    </ul>

    <h1>My Webpage</h1>
    {{ a_variable }}

    {# a comment #}
</body>
</html>

外部ファイルの実行