Open5

Flask first step memo

しんせいたろうしんせいたろう

私のローカル環境

$ cat /etc/os-release 
NAME="Linux Mint"
VERSION="20.3 (Una)"
ID=linuxmint
ID_LIKE=ubuntu
PRETTY_NAME="Linux Mint 20.3"
VERSION_ID="20.3"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.linuxmint.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=una
UBUNTU_CODENAME=focal
しんせいたろうしんせいたろう

quick start

touch hello.py
# hello.py

from flask import Flask

# WSGIアプリケーションインスタンス作成
app = Flask(__name__)

# routing と ハンドラ関数
@app.route("/")
def hello_world():
    return "<H1>Hello World</H1>"
  • サーバを立ち上げ。
  • --app オプションでFlaskにアプリケーションの場所を教える。
  • --debug で開発環境として立ち上げる。ホットリロードが有効になる。
$ flask --app hello --debug run 

 * Serving Flask app 'hello'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
しんせいたろうしんせいたろう
  • パスパラメータ
  • escape メソッドで囲む。これで必ず文字列として処理され、<script>alert("bad")</script>などもスクリプトではなく文字列扱いになり、インジェクション攻撃から守ることができる。

from flask import Flask
from markupsafe import escape

app = Flask(__name__)

@app.route("/<name>")
def hello(name):
    return f"Hello, {escape(name)}!"

@app.route("/id/<int:userid>")
def helloid(userid):
    return f"Hello, {escape(userid)}!!!!!!"

型は以下の4つ

  • string (default) slash以外の文字列
  • int 正の整数
  • float 正の浮動小数
  • path slashe付きの文字列
  • uuid UUID 文字列