Flaskのセットアップと思想の理解
Flaskのセットアップと思想の理解
Windows環境でのflaskのセットアップ
必要なもの - Windows NT - MSYS(前の記事でセットアップは紹介している) - (ActivePyhon)http://www.activestate.com/activepython or (NormalPython)http://www.python.org/download/のインストールパス追加
Flaskとは何なのか
Wikipediaの定義による以下のようになっている
Flaskは、標準で提供する機能を最小限に保っているため、自身を「マイクロフレームワーク」と呼んでいる。Flask自身は、他のフレームワークがしばしば持っているような、データベース抽象化レイヤやフォーム値の検証などの機能を持たない。これは、どんなWebアプリケーションにも適合する良い基盤を作るための設計判断だとしている(例えば、テンプレートエンジンはほとんどのWebアプリケーションで有用だが、RDBMS等はすべてのアプリケーションが必要とするものではない)[2]。とはいえ、それらの機能を、あたかもFlaskが元からサポートしているかのように追加できる拡張性も備えている。現段階において、オブジェクトリレーショナルマッパや、フォーム値の検証、ファイルのアップロード、ユーザログイン、種々のオープンな認証技術をサポートする拡張などが第三者によって提供されている[3]。
気になる一言
- データベース抽象化レイヤやフォーム値の検証などの機能を持たない
これはどういうことなのか
いくつかの理由はあると思うが,著者が触っていて感じた限りでは,PHP+MYSQLみたいな鉄板な組み合わせがCakePHPを作ったのだろうという予想はつく.
この文化がMVCを持たせることになったのであろうとは予想がつく.
Pythonはバッテリー内蔵型言語と呼ばれている.デフォルトのライブラリに十分な量があり,SQLLiteまでサポートしている.KVSとして使えるDBMもだ.
もともと,Pythonの構文とDBは密結合になっているので,あんまり分離してどうこうというものが生まれなかったのではないのではないか.(推測)
まぁ,私としてもMVCモデルをいつまでも業界のスタンダードとして現役活躍させるつもりもないので,パラダイムは常に違ったものでなるということを意識しましょうということだろう...
つまり,やならきゃいけないことは多い
- 何も考えないとDefaultのsqliteかBerkleyDBGenericを使えるだろう
- ORマッパーを自力で作れれば,まあ世話がないな.LevelDBとcPickleで作ってみたい
- cPickleを使うのもあれなので,流行に乗ってmsgpackとか
やらなきゃいけないことが多いということは,採用サイトは少ない?
- (転職サイトで見る感じ)https://www.wantedly.com/mid_career/japan/engineer/flask
少ない,二件のみ.RoRはたくさんあった
RoRは宗教
私はスパゲッティモンスター教
あなたの宗教に合わせて,やればいい
MVCを強制しないのであれば何を使えばいいのさ?
- MVVMと考えればいいんじゃないのか(提案)
Model(aap.py)とかView(flaskが完全担当)とか(ViewModel(Jinja2 template))ぐらいに分けて考えればいいんじゃないですかね()
setup
以下はWindowsのMSYSを例にとっている.
また,Pythonは(ActivePyhon)http://www.activestate.com/activepython を用いた
環境によってはsetuptoolsのインストールが必要になるかもしれません
ダウンロード
wget https://pypi.python.org/packages/source/F/Flask/Flask-0.10.1.tar.gz --no-check-certificate tar zxvf Flask-0.10.1.tar.gz cd Flask-0.10.1 python setup.py build python setup.py install
細かい解説は飛ばして,ログインだけができる例(Windowsで動くように設計済み)
貴君らには,モジュールの使用例から何を行っているのか逆引きして理解できるものと期待している.
なのでちょっと解釈に困難があったところのみ列挙する.
- flash;templateに渡す際に特定の文字列を表示する(密結合になってしまっていいのかな?)
- app.configでしかUSER, PASSWORDが一個しか定義できてない; 頑張って,DBを拡張して引けるようにしよう
- session;くそめんどくさい,いろいろ見たが,現実的にはredisなどを使うのがよいだろう
import os from flask import Flask, url_for, redirect, render_template, request, g, session, flash from sqlite3 import dbapi2 as sqlite3 # Create Flask application app = Flask(__name__) # Load default config and override config from an environment variable app.config.update(dict( DATABASE='flaskr.db', DEBUG=True, SECRET_KEY='development key', USERNAME='admin', PASSWORD='default' )) app.config.from_envvar('FLASKR_SETTINGS', silent=True) def connect_db(): """Connects to the specific database.""" rv = sqlite3.connect(app.config['DATABASE']) rv.row_factory = sqlite3.Row return rv def init_db(): """Creates the database tables.""" with app.app_context(): db = get_db() with app.open_resource('schema.sql', mode='r') as f: db.cursor().executescript(f.read()) db.commit() def get_db(): """Opens a new database connection if there is none yet for the current application context. """ if not hasattr(g, 'sqlite_db'): g.sqlite_db = connect_db() return g.sqlite_db @app.teardown_appcontext def close_db(error): """Closes the database again at the end of the request.""" if hasattr(g, 'sqlite_db'): g.sqlite_db.close() @app.route("/") def hello(): return 'hello world' @app.route("/list") def list(): books = ["book1", "book2", "book3"] return render_template("list.html", items=books) @app.route('/login', methods=['GET', 'POST']) def login(): error = None if request.method == 'POST': if request.form['username'] != app.config['USERNAME']: error = 'Invalid username' elif request.form['password'] != app.config['PASSWORD']: error = 'Invalid password' else: session['logged_in'] = True flash('You were logged in') #return redirect(url_for('show_entries')) return redirect(url_for('hello')) return render_template('login.html', error=error) @app.route('/logout') def logout(): session.pop('logged_in', None) flash('You were logged out') return redirect(url_for('show_entries')) if __name__ == '__main__': app.debug = True init_db() app.run()