Help us understand the problem. What is going on with this article?

Flaskの簡単な使い方

Pythonの軽量フレームワーク。Flaskの最低限の使い方。
とりあえず自分が使う範囲を調べてメモ。

後はQuickStartをやれば一通りわかる。
Djangoな人はこちらもどうぞ。

準備と簡単な使い方

環境

MacでPython3を入れて、venvで仮想環境を作成した状態。

インストール

pip install Flask

Hello World

作業フォルダを作成。とりあえずどこでも、なんでもよい。

cd
mkdir flask
cd flask

hello.pyという名前でコードを書く。

hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    name = "Hello World"
    return name

@app.route('/good')
def good():
    name = "Good"
    return name

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

実行

実行してみる。

python hello.py

下記URLにアクセスしてみます。

http://localhost:5000/
http://localhost:5000/good

無事表示されました。簡単。

Jinja2を利用する

Flaskには標準でJinja2というテンプレートエンジンが付いているので使ってみます。
templatesというフォルダを作る。そこに、htmlを置きます。

共通テンプレート

まずは共通テンプレートから。フッターとかヘッダーとか。ここではかなり手を抜きます。
書き方はDjangoとよく似ていますね。

layout.html
<!doctype html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
{% block content %}
<!-- ここにメインコンテンツを書く -->
{% endblock %}
</body>
</html>

個別ページ

次に個別ページ。 {% block content %}の内容等を定義します。

hello.html
{% extends "layout.html" %}
{% block content %}
<h3>Hello</h3>
こんにちは。{{ name }}さん。
{% endblock %}

hello.pyの変更

テンプレートを利用し、かつ、変数を渡すようにhello.pyを変更します。

hello.py
from flask import Flask, render_template #追加

app = Flask(__name__)

@app.route('/')
def hello():
    name = "Hoge"
    #return name
    return render_template('hello.html', title='flask test', name=name) #変更

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

変更したら http://localhost:5000/ にアクセスしてみます。

DB(MySQL)を利用する

せっかくなのでデータベース(MySQL)を利用してみます。
まずはhello.pyをいじってみます。なおMySQLへの接続にはPyMySQLを利用します。

インストールがまだであれば、

pip install PyMySQL

でインストールして下さい。

ロジックの実装

ロジックというほどではありませんが、下記のようにしました。
接続情報等は共通部品にするとか、with句を使うとかした方がいいと思いますがとりあえず。。。

hello.py
from flask import Flask, render_template #追加
import pymysql #追加

app = Flask(__name__)

@app.route('/')
def hello():

    #db setting
    db = pymysql.connect(
            host='localhost',
            user='root',
            password='root',
            db='testdb',
            charset='utf8',
            cursorclass=pymysql.cursors.DictCursor,
        )

    cur = db.cursor()
    sql = "select * from members"
    cur.execute(sql)
    members = cur.fetchall()

    cur.close()
    db.close()

    #return name
    return render_template('hello.html', title='flask test', members=members) #変更

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

個別ページ変更

内容をforでループして表示させてみます。簡単です。

hello.html
{% extends "layout.html" %}
{% block content %}
<h3>一覧</h3>
<ul>
{% for member in members %}
    <li>{{ member.name}} : {{ member.email }}</li>
{% endfor %}
</ul>
{% endblock %}

うまくいきました。

パラメーター連携

次に、簡単なパラメーター連動を。

URLから

モダン。URLから値を取得してみます。

hello.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/hello/<name>')
def hello(name=None):
    #return name
    return render_template('hello.html', title='flask test', name=name) 

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

下記のようなURLでアクセスしてみます。

http://localhsot:5000/hello/hoge

POSTから

次にPOST。formのHTMLは省いています。普通にpostするfromを作ってpostしてみてください。
メソッドを明示しないと「Method not allowed」的なエラーが出るようです。

from flask import Flask, render_template, request #追加

app = Flask(__name__)

@app.route('/hello', methods=['POST']) #Methodを明示する必要あり
def hello():
    if request.method == 'POST':
        name = request.form['name']
    else:
        name = "no name."
    return render_template('hello.html', title='flask test', name=name) 

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

GETから

最後にGETというかQueryString。

hello.py
from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/hello')
def hello():
    name = request.args.get('name')
    return render_template('hello.html', title='flask test', name=name) 

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

下記のようなURLでアクセスしてみます。

http://127.0.0.1:5000/hello?name=hoge

JSONを返す

最後にJSONを返してみたいと思います。
jsonifyを利用すれば簡単なのですが、日本語文字化け対応とソート順対応をしています。
正しいかどうか微妙ですがとりあえず。

手動生成したディクショナリを返す

hello.py
from flask import Flask, render_template, request, jsonify #追加

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False #日本語文字化け対策
app.config["JSON_SORT_KEYS"] = False #ソートをそのまま

@app.route('/hello')
def hello():
    data = [
        {"name":"山田"},
        {"age":30}
    ]
    return jsonify({
            'status':'OK',
            'data':data
        })

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

DBの結果を返す

DBのSELECT結果を返してみたいと思います。
上記の例で、DBの接続情報部分を汎用化してみました。

hello.py
from flask import Flask, render_template, jsonify #追加
import pymysql #追加

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False #日本語文字化け対策
app.config["JSON_SORT_KEYS"] = False #ソートをそのまま

def getConnection():
    return pymysql.connect(
        host='localhost',
        user='root',
        password='root',
        db='testdb',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor,
    )

@app.route('/')
def hello():
    db = getConnection()
    cur = db.cursor()
    sql = "select * from members"
    cur.execute(sql)
    members = cur.fetchall()
    cur.close()
    db.close()

    return jsonify({
        'status':'OK',
        'members':members
        })

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

下記のようなJSONが返ります。

{
  "status": "OK", 
  "members": [
    {
      "id": 1, 
      "name": "hoge", 
      "email": "hoge@hoge.com"
    }, 
    {
      "id": 2, 
      "name": "foo", 
      "email": "foo@foo.com"
    }
  ]
}

以上。また必要に合わせて追記したいと思います。

zaburo
こんにちは。自分用のメモをだらだら公開しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした