flask-sqlalchemy での relationship のオプション backref について - Flask Web Development の勉強(3)-
最初?と思ったのでメモ
ユーザーと、それに紐づくロールのテーブルを想定
test.py
from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy import os basedir = os.path.abspath(os.path.dirname(__file__)) # hello.pyの存在するディレクトリ app = Flask(__name__) # # app.config 設定 app.config['SQLALCHEMY_DATABASE_URI'] =\ 'sqlite:///' + os.path.join(basedir, 'data.sqlite') # sqliteのベースディレクトリ指定 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] =True # データベース変更時に自動コミットする設定 db = SQLAlchemy(app) # db操作用のオブジェクト生成 # SQLAlchemyのテスト用クラス class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) users = db.relationship('User', backref='role') # usersテーブルへの逆参照 ?? class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True)
ここで対話シェルで
from hello import db db.drop_all() db.create_all() from hello import Role, User admin_role = Role(name='Admin') mod_role = Role(name='Moderator') user_role = Role(name='User') user_john = User(username='john', role=admin_role) user_susan = User(username='susan', role=user_role) user_david = User(username='david', role=user_role) db.session.add_all([admin_role, mod_role, user_role, user_john, user_susan, user_david]) db.session.commit()
と入れると以下のようなテーブル構造になる
roles | users | ||||
---|---|---|---|---|---|
id | name | id | username | role_id | |
1 | Admin | 1 | john | 1 | |
2 | Moderator | 2 | susan | 3 | |
3 | User | 3 | david | 3 |
ここで例えば、user_susan以下を見るとこんな感じになってる
user_susan.id user_susan.query user_susan.role user_susan.username user_susan.metadata user_susan.query_class user_susan.role_id
user_susan.roleというのができていて、user_susan.role以下は
user_susan.role.id user_susan.role.name user_susan.role.query_class user_susan.role.metadata user_susan.role.query user_susan.role.users
と、結びつけられたroleをuser_susanオブジェクトから参照できるようになっている。
print(user_susan.role.id) >>3 print(user_susan.role.name) >>User
となる。backref指定がない場合どうなるかはおいおい調べようかなと。
ORM、概念はわかるのですがsqlベタ書きのほうが今んとこ楽ですね・・・
ARM mbed でLチカ(LPC 1114FN28)
GWも終わりですが、久々に手で物いじりたくなり電子工作しています。
(そのうちきちんと書こうかとは思いますが)
もともとはもっとハードより(物性ーアナログ回路)が守備範囲だったので、マイコンを使ったデジタルな電子工作はだいぶ久々なのですが……
Raspberry Pi で遊ぼうかとも思ったのですが、値段や機能がIoT(コンセプトは面白いけどできることって…)の主役たりえるか、少し?マーク(もともと教育用ですし)
Arduino は昔触ったし、せっかくだから32bitマイコン手出してみようかな…と思い本屋行ったら
- 作者: 勝純一
- 出版社/メーカー: 翔泳社
- 発売日: 2016/01/23
- メディア: 大型本
- この商品を含むブログ (5件) を見る
スイッチサイエンスの書き込み器付きのチップ買って、後はテキトーにLEDと抵抗(200Ωくらい)買ってきて。
ARMコアのマイコンの、めんどくさい部分をよきに計らってくれて、Arduinoみたいにとっつきやすいのがmbedの売りなのかなーと、ざっと触ってみた感じ思います。
アカウント作成→ブラウザにコード入れてコンパイル→チップへ転送、
てのは驚きましたが。今日日たしかにネットに繋がらない環境のほうが少ないでしょうし、個人で作る分にはこれでいいのかも?
Lチカまで本片手に5分で出来たので、結構楽しくなるかもしれません。
個人的にはブレッドボードは接触不良のデバッグとかがしづらいので、あんま好きではないんですが、楽ですね。
.vimrc改修その3( jedi-vim を dein_lazy.toml へ移動、emmet-vim, vim-surround 導入)
前回は遅延ロードなるもの理解していなかったので、dain_lazy.tomlのほうへ jedi-vimを移動しました。
こちらの記事(http://qiita.com/kawaz/items/ee725f6214f91337b42b)によると、on_ftなどon_XXで起動指定しているプラグインは自動で遅延ロードになるそうです(そりゃそうか)
ついでにFlaskまわりでHTMLいじること多くなるなと思ったので2つ追加。
jediの補完をpyvenvで動かしてる仮想環境読みに行けるようにできればいいのだけれど、なかなか難しくて挫折。。。
flask-script の使い方 -Flask Web Developmentの勉強(2)-
Flaskだと通常
from flask import Flask app = Flask(__name__) """もろもろ""" if __name__ == '__main__': app.run(debug=True)
と書きますが、これだと実行状態の指定(debugモードONとか、走らせるHost指定とか)を態々該当.pyファイルを編集する必要があります。
コマンドラインから実行指定できた方が便利ーということで、flask-script (http://flask-script.readthedocs.io/en/latest/)というエクステンションが利用できるようです。
pip install flask-script
で入れた後はこんな感じのファイルを用意してあげて(めんどいので前記事のhello.pyと同じディレクトリに置いてあげてimportしてます)
あとはコマンドラインから
python manager.py rumserver --host 0.0.0.0 -d
とかしてあげれば、
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
とパブリックIP参照、debugモードonの状態で起動してくれます。
- dなしだとoffの状態で起動するみたいです。
便利ですね。
参考書籍:
Flask Web Development: Developing Web Applications with Python
- 作者: Miguel Grinberg
- 出版社/メーカー: O'Reilly Media
- 発売日: 2014/04/28
- メディア: Kindle版
- この商品を含むブログを見る
Flask Web Development の勉強(1)
GWということで洋書ですが
Flask Web Development: Developing Web Applications with Python
- 作者: Miguel Grinberg
- 出版社/メーカー: O'Reilly Media
- 発売日: 2014/04/28
- メディア: Kindle版
- この商品を含むブログを見る
GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)
- 作者: 大塚弘記
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (22件) を見る
ついでに私はGETとPOSTの違いも最近わかったレベルなので
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者: 山本陽平
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)
- 購入: 143人 クリック: 4,320回
- この商品を含むブログ (181件) を見る
この本の筆者のMiguelさんはFlask Mega Tutorialというサイトも公開されているかたで、「Flask tutorial recommend」とかでググるとここがいいよ!的な知恵袋みたいなページがよくヒットします。
本の方がいいかな、と思って読んでみはじめたのですが、面白いアプローチでGitHubからリポジトリをクローンしてきて、各節に対応したタグへとチェックアウトしてコードを眺める、という進め方をしています。最終的にはブログっぽいのができますよーといった感じのようです。
github.com
ディレクトリ構造とかあれこれ環境整える必要がないですが、いい加減GitHubも慣れなきゃ慣れなきゃ、と思ってたので自分で手組みしてPush、というのを試してみようかなと。
ということで一番最初の章ながめながらapp.pyの挙動を見てみています。
(pyenv + venvでPython3環境で試してみてるのですが、日本語扱いやすくていいですね!)
Cookieが動作どうしてるのかいまいちよくわかってない(⇦
のですがのんべんだらりと進めてこうかなーと
このペースだとGW終わっちゃいそうですが
.vimrc改訂作業(dein, jedi導入中)
nihaoshijie.hatenadiary.jp
こちらを参考にvimをガチャガチャいじってたんですが、「Neobundle インストール」で調べてたらdeinというのに開発が移った?のか
qiita.com
という記事を発見したので試行錯誤しながら入れてみました
" ---------- dein.vim 設定 ---------- " ディレクトリ設定 if &compatible set nocompatible endif let g:rc_dir = expand('~/.vim') "設定ディレクトリ let s:dein_dir = expand('~/.vim/dein') " deinディレクトリ let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim' " deinリポジトリ " dein.vim がないときgit clone if &runtimepath !~# '/dein.vim' if !isdirectory(s:dein_repo_dir) execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir endif execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p') endif " プラグイン設定 if dein#load_state(s:dein_dir) call dein#begin(s:dein_dir) " プラグインリストの場所 let s:toml = g:rc_dir . '/rc/dein.toml' "通常ロード let s:lazy_toml = g:rc_dir . '/rc/dein_lazy.toml' "遅延ロード " プラグインリストのロード call dein#load_toml(s:toml, {'lazy': 0}) call dein#load_toml(s:lazy_toml, {'lazy': 1}) call dein#end() call dein#save_state() endif " 未インストールのものをインストール if dein#check_install() call dein#install() endif filetype plugin on " ---------- 基本設定 ---------- syntax enable "構文ハイライト有効化 set number "行番号表示 set showmatch " 対応括弧強調表示 set backspace=indent,eol,start"backspaceを有効化 " ---------- タブ設定 ---------- set expandtab " ソフトタブ有効化 set tabstop=8 " タブ文字幅はスペース8つ相当 set softtabstop=4 " ソフトタブ幅はスペース4つ " ---------- インデント ---------- set autoindent " 改行時自動インデント set shiftwidth=4 " autoindent時の幅を4に " ---------- Python設定 ---------- autocmd FileType python setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class " 改行時自動インデントする宣言 let python_highlight_all =1 " Python用のシンタックスハイライトを全てONに
もう一個
[[plugins]] repo = 'Shougo/dein.vim' [[plugins]] repo = 'Shougo/vimproc.vim' build = 'make' [[plugins]] #name = 'lang/python/compl-jedi' repo = 'davidhalter/jedi-vim'
ひとまず動く感じにはなったっぽい。
jediまわりもちっといじったほうが良さそう
にしても慣れてないからかもしれませんがvimrcとかの設定って1日とけますね…
Flaskのimportでつまずいた話(Python の import を階層構造で )
Flask を学習し始めたのですが、
__init__.py
from flask import Flask app = Flask(__name__) from app import views
としててのっけから??となってしまいました。
- なんで一番下でもっかいimport?
- appなんてモジュール入れてないよ?
と。
1は
Larger Applications — Flask Documentation (0.10)
のCircular Importsに書いてあったのですが、循環importを解決するのにそうしてるとのこと(はっきり理解したわけではないのでまた調べたいです)
2はディレクトリの構造が
app |-__init__.py |-views.py
となってたのですが、__init__.pyがあるとそこのフォルダ(今回はapp)をまるっとモジュールとして扱えるようになるんですね(パッケージ化)。
6. モジュール — Python 2.7.x ドキュメント
それでfrom app import viewsなんて出来たのだと。
まだ勉強中ですが、ちょこちょこ備記録代わりに上げてけたらなあと