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

Flask ~Hello, my application~ part1

More than 3 years have passed since last update.

はじめに

しばらくずっとDjangoを扱ってきましたが、他のフレームワークも扱っていこうという事でFlaskを扱っていきます。Djangoに比べて軽量のフレームワークとして知られており、isuconの予選で用いられていたりなど学んでおく必要性を感じたので、まずはチュートリアルをやっていこうと思います(isuconの話を持ち出すとbottleも触れなくてはいけないですが...)
基本的に本家のチュートリアルを参考に進めますので、細かい部分はそちらを参照していただければと思います。あくまで今回は「触れてみる」事が前提です
チュートリアルの内容は、マイクロブログの作成になります
part2はこちらから
Flask ~Hello, my application~ part2

インストール

$ virtualenv -p python3 --no-site-packages test_flask
$ cd test_flask
$ source bin/activate
(test_flask)$ pip install Flask 

上記の通りに進めれば下準備は出来るかと思います
ちゃんとFlaskが入っているかは、一応pip list等で確認しておいて下さい
Flaskは0.11.x、Pythonは3.5系で進めます

ディレクトリ構成

/bin
/flaskr
    /static
    /templates
    flaskr.py
    flaskr.db
    schema.sql
...

大体こんな感じかと。チュートリアルにもある通り、staticとtemplateのディレクトリは先に作っておいてしまいましょう

データベースの定義(Step1)

schema.sqlに書いていきます。表現的に合っているかはわかりませんが、揮発性のDBです

schema.sql
drop table if exists entries;
create table entries (
  id integer primary key autoincrement,
  title text not null,
  'text' text not null
);

セットアップ(Step2)

本体の部分となるflaskr.pyを書いていきます

flaskr.py
import os
import sqlite3
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash

#アプリケーションの作成
app = Flask(__name__)
app.config.from_object(__name__)

# configの記述
app.config.update(dict(
    DATABASE=os.path.join(app.root_path, 'flaskr.db'),
    SECRET_KEY='development key',
    USERNAME='admin',
    PASSWORD='default'
))
app.config.from_envvar('FLASKR_SETTINGS', silent=True)

#DBへの接続
def connect_db():
    rv = sqlite3.connect(app.config['DATABASE'])
    rv.row_factory = sqlite3.Row
    return rv

Step2においてはまずここまでで一度Flaskを動かそうとしています
動かし方は以下の通りです(flaskrディレクトリ内で)

$ export FLASK_APP=flaskr.py 
$ export FLASK_DEBUG=1
$ flask run

FLASK_DEBUGは、本番環境では切ります
チュートリアルではFLASK_APP=flaskrでしたが、上手く動かなかったので拡張子まで指定しました
もちろんですが、viewを作っていないためにアクセスしようとしても404を返されます

データベースの作成(Step3,Step4)

続けてflaskr.pyに記述していきます

flaskr.py
...
#先程のconnect_dbを用いて新しいDBを作成
def get_db():
    if not hasattr(g, 'sqlite_db'):
        g.sqlite_db = connect_db()
    return g.sqlite_db

#DBを閉じる
@app.teardown_appcontext
def close_db(error):
    if hasattr(g, 'sqlite_db'):
        g.sqlite_db.close()

#DBの初期化
def init_db():
    db = get_db()
    with app.open_resource('schema.sql', mode='r') as f:
        db.cursor().executescript(f.read())
    db.commit()

@app.cli.command('initdb')
def initdb_command():
    """Initializes the database."""
    init_db()
    print('Initialized the database.')

先程定義したsqlファイルを用いてsqliteのコマンドを打っていきます

$ sqlite3 /tmp/flaskr.db < schema.sql

このコマンドだとdbファイルが/tmp/内に作られます。同じフォルダ内に作りたい場合はパスを変えれば大丈夫だと思われます
後はDBを初期化するコマンドを打つだけです

$ flask initdb

思ったより長くなってしまったので、次回で完結させます

Why do not you register as a user and use Qiita more conveniently?
  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
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