月別: 2012年9月

Home / 月別: 2012年9月

initializedb.py

2012-09-28 | Pyramid, Python | コメントはまだありません

initialize_Xxx_db.exeとかであれしますねDBの初期化とか。

 ../Scripts/initialize_Xxx_db development.ini

みたいな。
これどこでセットアップするテーブルの一覧見てんのかなーというと、
Xxx/xxx/scripts/initializedb.py
でした。

うちの環境は

models/
  models.py
  users.py

こうです。scaffoldのmodels.pyがそのまま生存しているのでなんか紛らわしい。よくない。よくないお。

で、件のinitializedb.pyのなかでモデル取り出してるところがあったのでー

from ..models.models import (
    DBSession,
    Base,
    )
from ..models import (
    models, users
    )

こんなふう。

#備考:
#あたしんちはmodelsディレクトリ切ってその中にモデルのファイルを入れています。
#なのでmodels/__init__pyにこんなふう。

# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    )
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

Scaffoldで先人の知恵を学ぶ

2012-09-26 | NDI | コメントはまだありません

SQLAlchemy(+MongoDB)+Jinja2(Genshi)
この組み合わせはあるだろう。Github眺めたら実際あった。
あたしが当面やりたいことがRapidGizaで解決してる。
とおもいきや既にgithub死んでました。いい名前なのに。
PythonのWAF周辺のライブラリ名は結構好きです。ピラミッド、アルケミー、フラスコ、クフ、エリクサーなんてのもあったな。こういう妖しい単語大好き。
はい。

App/app/scripts/initializedb.py:

- from .models.models import (
+ from ..models.models import (

modelをmodelsディレクトリに移動してまとめたので書き換え。
そのままルートにばらまいてる人はそのままでおk
あんま小分けにしても使いづらいのかなあ。みんなディレクトリ切って小分けにしてしまっちゃいました。

models/
lib/
scripts/
tests/
web/
  templates/
  views/
  static/
    css/
    js/
    img/
__init__.py
const.py

こんな按配です。
ディレクトリの配置やconst.pyなどについては、shazow / pyramid_scaffolds_decoupledさんやグローバル定数@rm -rf /さんを参考にしました。

コレにともなってapp/__init__.pyの中がちょっと書き換わりますね。

config.add_static_view('static', 'web/static', cache_max_age=3600)

config.scan('.web.views') # views
config.scan('.lib')

Pylonsでいうところのhelperをどっかに置きたい。libを切ればいいか。
PyConJP2012で、Pyramidにはhelperない云々、WebHelperとかそういうの使ってくださいという話を聞き、にわかに情緒不安定になり、言いつつも実はPylonsっぽいhelperの使い方もします、みたいな、なんだか狐につままれたような話を聞いてきたばっかりなのであります。
h.hoge()とかしたくない?したいよねえ。

あんまり意識していなかったんですが、Pyramidっていうのはメタフレームワークなのかな。土台あるんで好きに(俺俺フレームワークを)構築してノウハウ貯めこんだりしちゃってくださいよというような。
なんかFlask意識したっぽい「1ファイルで動く代物書けちゃう!」みたいなデモはする必要ないよね。1ファイルで済むようなもの作りたければ普通Flaskとか使う。
#学習コスト云々といった理由は除く

ともあれ、構成とか落ち着いたらScaffoldの作成にも手を出してみたい。
この機能はステキだ。

○○言語は生産性が高い

2012-09-26 | 未分類 | コメントはまだありません

記事がなにを狙ってるのかよくわからない。
次の主流は「関数型」 覆る言語選定の常識
図●関数型プログラミング言語の利点と技術的な特徴
開発の生産性を高めやすい、バグを抑止しやすい、性能を向上しやすいといった利点がある

日経っぽいなあと思ったらほんとにそうだったワロス

Javaとかphpとかは下の方でHaskellとかがだいたい上の方という、もう何回それ繰り返すんだよ図だ。

単に学習コストが高くて、頭いい人が飛びつく言語が上の方にきてるだけじゃないのかなー。
優秀な人しか界隈に居ないから生産性が高いんだよ。
たぶんHaskellとか使う人たちがJavaでもの作れば同じように生産性と品質が高いんじゃないのかね。

あたしの生産性は低いのでもっとどうでもいいです。

ルート直下にviews.pyとか散らかしたくない

2012-09-25 | Jinja, Pyramid, Python | コメントはまだありません

#pcreate -s alchemy Hoge で作ったプロジェクトを例にしています
App/app/views/views.py
とかしたい。

__init__.py

config.scan('.views')

このようにせいと、マニュアルに書いてある
この「.views」ってなんじゃ。ドットから始まるディレクトリ掘るというのはいささか悪趣味に感じるんだけど。

views掘ってみる。__init__.py置く。views.pyをそこに格納。
これだけだと

ImportError: No module named models

なんてerror吐かれて、あたしゃビューの面倒見てんのになんでモデルがしゃしゃり出てくるんだと奇妙な感じ。
なんだろうなあとviews.pyを眺めて、はたと膝を打つ。

from .models import (
    DBSession,
    MyModel,
    )

これだ。

from ..models import (
    DBSession,
    MyModel,
    )

こうする。微妙すぎてあれだけど、「.models」→「..models」になってる。
いつのバージョンだかからこういう指定の仕方できるようになったんですみたいな話を聞いていたのが救いになった。
で、件の「.views」も同じことだったわけかーと納得した次第です。
カレントディレクトリの下のviewsをscanするから「.views」なのねー。

あー。modelのスクリプトもmodels/models.pyとかにしたい場合は、views.pyでのモデルの場所指定も変わるね。

MakoじゃなくてJinja2使いたい

2012-09-25 | Jinja, Pyramid, Python | コメントはまだありません

Pyramidのわだいです。

“.mak” または “.mako” で終わるテンプレートファイル名は Mako レンダラー に送られます。
“.html”のような他の拡張子が使いたければ、 main 関数に これを入れてください:
config.add_renderer(“.html”, “pyramid.mako_templating.renderer_factory”)
引用元

で、こういうののjinja2はどうしたらいいのか探してましたのよ。
pyramid.mako_templating.renderer_factory
これはなーに?どういう決まりでこれになってんの。分からない。
あたしはMakoを使うつもりがない。いいテンプレートエンジンなのは知ってる。少し。あたしの好みはJinja2でありGenshiなので、Jinja2が動いてくれないと嫌なのです。
#Genshiはちょっと気難しい子なので最近は避けてます(-_-;

Jinja2のテンプレートを食わせるまではうまく行った。
がしかし、拡張子「.jinja2」が非常に気に入らない。長いしダサいしそもそも数字がついてるのが非常に駄目だ。
あたしゃテンプレートの拡張子.htmlじゃなきゃ嫌なんだよ。
でもなんだか、中のほうで拡張子ごとにゴニョゴニョしている箇所があるらしく、テンプレートファイルとしてhoge.jinja2を単純にhoge.htmlとしてもうまくいかない。

あちこちさまよった結果、

config.add_renderer(".html", "pyramid_jinja2.renderer_factory")

__init__.pyでこうしてやるとうまくいった。.htmlでも食べるようになる。やった。
そもそもこの文字列はどこで見つけたのかというと、site-packagesのpyramid_jinja2見に行って、configure.zcmlつう怪しいファイルの中に書いてあるのを発見したという次第。
見つけ方合ってるのかわかりませんが解決したからいいんだ。

まとめ

当然のこととしてjinja2とpyramid_jinja2はいれとく

development.ini:

[app:main]に追記
jinja2.directories = %(here)s/{アプリ}/templates

pyramid.includesに追記
pyramid_jinja2

アプリ直下の__init__.py:

config = Configurator(settings=settings)
config.include('pyramid_jinja2')
config.add_renderer(".html", "pyramid_jinja2.renderer_factory")

まだ「リソースとビュー」の考えかたは染みこんできてない。
モデルよりフレームワークの仕掛けより、あたしはまず好みのテンプレートエンジンが動かないと気分的に落ち着かず、ただでさえ少ない集中力が減退する構造になっているんです。
というところがすっきりして、ひじょーに、こう、いいですね。
すっきりしました少し。