エラーの制御

入力エラーなどでエラー画面に遷移したい。
お任せ下さい。Pyramidならすぐです。(WebFrameworkならどれも実装していそう)

views.py

class VariableError(Exception):
    def __init__(self, msg):
        self.msg = msg

@view_config(context=VariableError, renderer='error.mak')
def err(exc, request):
    '''エラー発生時
    '''
    return {'errmsg': exc.msg}

@view_config(route_name='setlog', request_method='GET')
def set_log_error(request):
    '''GETははじく
    '''
    raise VariableError('不正な投稿をしないで下さい(GET)')

たとえば、掲示板への投稿にGETを使ったら、「不正な投稿をしないで下さい(GET)」と表示させたい。
そんな画面遷移が実現されちゃいます。
exc.msgはなんか勝手に定義されているらしい。

GridFSのremoveってかDeleteってか

GridFS(バイナリ、というか絵とか映像とか)コレクションから削除したい、と言う時は
標準のメソッドとしてはremove({※検索文字列})を使うが、pymongo的にはdelete(file_id)なのだそうだ。
まあカラムは少ないし、うかつに消しすぎても困るのだろうという配慮だろうか。

        file = gridfs.GridFS(db).get_last_version(filename)
        gridfs.GridFS(db).delete(file._id)

当然chunkも漏れなく消える。
しかし一々fileの_idを取らないといけないのが何か二度手間だ。

参考:
http://api.mongodb.org/python/current/api/gridfs/index.html

クエリーについてドット表記

参考:
http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

あまり人の事は考えずに難しいSQLを書くのが好きな私は
やはりMongoDBでも小難しく考えたくなる。
しかしDBの性質上小難しく書く事はあまりない、のではないだろうか。

> db.persons.find( { likes : "math" } )

この一文で、likesカラムが配列Valueでも通常Valueでもとって来てくれるとな。

> db.persons.find( { children.likes : "math" } )

この一文で、childrenカラムの入れ子になるlikesキーが配列でも通常でも
はたまたchildrenが配列で多くのlikesがあったとしても、ドキュメント全体が取得できる。

まあchildrenドキュメントのみ、1件のみ欲しかったら別の対応が必要かな。

1.4が出そう

まだ1.4a1なんで適用はさせないけど、なかなかおいしい変更がある
さらっと読んだ感じだと
Easy Custom JSON Serializationは望んでいた変更だ。
http://d.hatena.ne.jp/sokky/20120911/1347377634みたいな事しなくてすみそうだもの。
Partial Mako and Chameleon Template Renderingsはよく分からん。
defs周りの改善?使えるようになった?いや普通に使えた気がするけど。

参考:
http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/whatsnew-1.4.html
http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/renderers.html#json-serializing-custom-objects

カスタムタグ的ななにか

JavaプログラマなんでTaglibみたいなのが欲しい。
そういう質問をしたら、Webhelper使うか、Jinja2にはFilterが実装されているよ、との事。
ほほうFilterとな。初めて聞いた。
自分はmako党なんで、makoにもFilterなるものが無いか探してみた。

参考:
http://docs.makotemplates.org/en/latest/filtering.html

test.html(mako実装)

<%!
	import myfilters as fil
%>

${honbun | fil.auto_link, n}

myfilters.py

def auto_link(text):
    '''HTTP等のURLがあったらリンクにする'''
    return re.sub('(https?|ftp|news)(://[0-9a-zA-z\+\$\;\?\.%,!#~*/:@&=_-]+)',
    '<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>',
    text)

これで自動的にURLにAタグをかぶせてくれる。


引数は必ず"text"一つのみ。
ただし、中身は何でも良いみたいなので
test2.html

${(honbun1,honbun2) | fil.get_tuple, n}
def get_tuple(text):
    name1, name2 = text
    return name2 + name1

nをつけないとシングルクオートをエスケープしちゃうんで必須かな。

利点は、やはり単体テストがフィルタに対して出来る事だろう。
makoちゃん様々だ。

Pycon2012に行ってきた

そこでメモった、試してみたい事を備忘録。

・Mongodbを触る時はMongoMagicとかいうモジュールを使ってみる。
参考:https://github.com/RedBeard0531/MongoMagic
MongoDB作ったエンジニアの一人が来日してて質問するすごい良いチャンスだったのに
英語で質問できなくてタイミングを逃した。何か悔しい。Tシャツはもらった。

Pygameを触ってみる。ただしゲームを作る予定はない。

・PyramidのAuthentication/Authorizationを使う。多分その機会はある。

・WebhelperとかいうモジュールでTaglibみたいな事が出来る。だが3.Xにしか対応してない。

Sphinxを使う。きっと仕事でも使える気がする。

・Python3.3を入れる。Pyramid1.3.3にバージョンアップする。

PostgreSQLの接続

今日はデータ移行のお仕事が舞い込んできた。
暇そうにしてたのが裏目に出たね。
データ移行だが、どうもフェッチだなんだが必要そう。
手段は問わないとの事なので、ここはPythonでの実装を目指そうか。
(一応、ストアドで何とかなりそうだなとは睨んでいるけど)

ドライバはpsycopg2を採用した。

import psycopg2
connection = psycopg2.connect(
  database='postgres', 
  user='postgres', 
  password='postgres', 
  host='127.0.0.1', 
  port=5432)

cursor = connection.cursor()
sql = """select * from from1;"""
sql2 = """select name from from2 where id='%s'"""

cursor.execute(sql)
rows = cursor.fetchall()

for row in rows:
    cursor.execute(sql2 % row[0])
    rows2 = cursor.fetchall()
    for row2 in rows2:
        print(row2[0])

結果はfrom2テーブルの
山田太郎
山本二郎
が返却される。よし。

ポスグレはあんまり好きじゃない。なんか半端にふわっとしてるから。