2013 年 7 月の記事一覧です(5 件)

[Flask][SQLAlchemy]ブログのタグ付けされた件数を取得する

このブログは下記のようなmany to many relationshipで構成されているのですが、タグに紐ついたエントリー件数をサイトバーのタグ一覧に表示させるというタスクをようやくやっつけたのでメモっておきます(Python2.7.3で確認しています)

$ sqlite3 -header flasklog/flasklog.db ".schema"
CREATE TABLE entries (
        id INTEGER NOT NULL,
        title VARCHAR(60),
        text VARCHAR,
        pub_date DATETIME,
        PRIMARY KEY (id)
);
CREATE TABLE entry_tags (
        tag_id INTEGER,
        entry_id INTEGER,
        FOREIGN KEY(tag_id) REFERENCES tags (id),
        FOREIGN KEY(entry_id) REFERENCES entries (id)
);
CREATE TABLE tags (
        id INTEGER NOT NULL,
        name VARCHAR,
        PRIMARY KEY (id)
);

ここらへんを参考にpython - SQLAlchemy ordering by count on a many to many relationship - Stack Overflow:

In [26]: from flasklog.models import Base, Entry, Tag, entry_tags

In [27]: from flasklog.database import db_session

In [28]: from sqlalchemy.sql import functions as func

In [29]: db_session.query(Tag, func.count(entry_tags.c.tag_id).label('total')).join(entry_tags).group_by(Tag).order_by('total DESC').all()
2013-07-28 20:48:51,083 INFO sqlalchemy.engine.base.Engine SELECT tags.id AS tags_id, tags.name AS tags_name, count(entry_tags.tag_id) AS total
FROM tags JOIN entry_tags ON tags.id = entry_tags.tag_id GROUP BY tags.id, tags.name ORDER BY total DESC
2013-07-28 20:48:51,083 INFO sqlalchemy.engine.base.Engine ()
Out[29]:
[(Tag(2, u'Python'), 19),
 (Tag(15, u'Flask'), 10),
 (Tag(6, u'Life'), 6),
 (Tag(5, u'Twitter'), 4),
 (Tag(41, u'Bottle'), 3),
 (Tag(1, u'blogmop'), 2),
 (Tag(3, u'Linode'), 2),
 (Tag(4, u'CentOS'), 2),
 (Tag(7, u'foursquare'), 2),
 (Tag(9, u'iPhone'), 2),
 (Tag(14, u'Shizuoka'), 2),
 (Tag(27, u'Google'), 2),
 (Tag(30, u'Ubuntu'), 2),
 (Tag(32, u'Alfred'), 2),
 (Tag(39, u'Shizuokapy'), 2),
 (Tag(8, u'AppleScript'), 1),
 (Tag(10, u'Dropbox'), 1),
 (Tag(11, u'OSX'), 1),
 (Tag(12, u'vim'), 1),
 (Tag(13, u'VPS'), 1),
 (Tag(17, u'DISQUS'), 1),
 (Tag(18, u'Atelier SANGO'), 1),
 (Tag(19, u'Git'), 1),
 (Tag(20, u'Dashboard'), 1),
 (Tag(21, u'Werkzeug'), 1),
 (Tag(22, u'iTunes'), 1),
 (Tag(23, u'iOS5'), 1),
 (Tag(24, u'Gmail'), 1),
 (Tag(25, u'hatena'), 1),
 (Tag(26, u'Chrome'), 1),
 (Tag(28, u'iPad'), 1),
 (Tag(29, u'Flipboard'), 1),
 (Tag(31, u'CotEditor'), 1),
 (Tag(33, u'Evernote'), 1),
 (Tag(34, u'Logwatch'), 1),
 (Tag(35, u'feedparser'), 1),
 (Tag(36, u'BeautifulSoup'), 1),
 (Tag(37, u'javascript'), 1),
 (Tag(38, u'bookmarklet'), 1),
 (Tag(40, u'virtualenv'), 1),
 (Tag(42, u'Bitbucket'), 1),
 (Tag(43, u'Jinja2'), 1),
 (Tag(44, u'SQLAlchemy'), 1)]

こんな感じで取得出来たので、あとはtemplateに展開していくだけですね

とりあえずわかったことは

  • sqliteはワンライナーで使う方が便利だと思った。zshの履歴に記憶されるし、パイプも使える。
  • 一般的なrelationshipなSQLAlchemyならばStack Overflowをチェックしていればある程度は解決できると再認識した。

[Flask][Jinja2]テンプレートファイルの整理整頓をした

このブログのtemplatesフォルダにあるテンプレートファイル(html)が随分前からゴチャゴチャしていて何とかしたかったのですが、やっと綺麗に出来ました。

とりあえずメインとなるテンプレートファイルから部品として切り離せるものを別ファイルにして、メインテンプレート内でインクルードさせました

参考にしてのはこちらの記事です

あとはvimの機能を利用してインデントをしっかりと付けて見返した時にイライラしないようにしました(これ大事)


[Python][Bottle]BottleでHTTPリクエストにおけるUser-Agentヘッダを取得する

BitbucketのWebhookサービスの送信元IPがマニュアルと違うもので送られてきて、いくら待ってもhookされないので、IPを当てにするのはもうやめようと思い、代わりにUser-Agent(それプラスJSONの内容)で判定することに。

とりあえずググったらすぐ発見。stackoverflowに出てました。

from bottle import request
ua = request.environ.get('HTTP_USER_AGENT')

因みにFlaskだとこのような感じになるようです。

from flask import request
ua = request.headers.get('User-Agent')

[Bottle][Bitbucket]BitbucketのWebhook機能の送信元IPアドレスが変更されていた

前回書いたブログがGit Pushしても反映されないので反映されない原因を切り分けて調べていたら、なんのことはない、JSONをPOSTするBitbucket側の送信元IPアドレスが変更されていた。

原因が分かったのはいいのだけど、コロコロ変わってもらっても困るなあと。

送信元IPは見ないでJSONの内容チェックして判断させるのも手だけども。ちょっと考える。

[Python]Shizuoka.py #2 に参加してFlaskについて話をしてきた

Untitled

Shizuoka.py #2 に行ってきました。またFlaskについて発表してきました。

会社でお偉いさん方にプレゼンすることは多々あれど、このような場で発表するのは初めてだったので、どのくらい笑いをとれるか心配でしたが、なんとか無事終えることが出来ました。


発表後、20分程で私の斜め後ろにいらっしゃったaodagさんがflaskからpyramidに書き換えてくれました


パーフェクトPython (PERFECT SERIES 5)
パーフェクトPython (PERFECT SERIES 5)

aodagさんが持参されたパーフェクトPython争奪じゃんけん大会で散ったので帰りのバスでamazonポチりました。じゃんけん大会を見事勝ち抜けてゲットされた@ringtaroさんおめでとうございます!

私以外の発表された方々のスライド(都度更新します)


javascriptも今年少しはやるつもりだったけど、今年も折り返し地点まできてしまったw



ちょっとVirtualBoxでサーバ立ててやってみようと思う。



パッケージングについて。正直ここまでたどりつけていないけど、ところどころは理解できた。今どのような状況なのかが整理されているので今後パッケージを作成することがあった場合、書籍やWebでパッケージングを調べる際、それが今有効なのかどうかを知るのにとても役立つと思った。

楽しかったので次回も参加出来たらまた何か発表したいです


PAGE TOP