pyramid jinja2 bootstrap いずれも自信がないから 妙に設定疑って調べてみたけど結局はしょうもないことだった奴です。

知識がある程度あれば安全地帯に旗をマークするように ひとつひとつ潰していけるんだけど、真っ白な平原では手当たり次第に進みがち。

Basic template

1
2
<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">

Bootstrap - Getting started を見ながらjinja2のテンプレートを作っていたんですが 動かしてみると紹介されてるページと見た目が随分と違うなと気づいて cssが適用されてないじゃん、とまでわかったのはよかったんですが

絶対パスで指定する方法を調べてしまったが

pyramid_jinja2 のようにiniファイルにJinja2 Filtersの設定を追加して

1
2
3
4
5
6
[app:yourapp]
# ... other stuff ...
jinja2.filters =
    model_url = pyramid_jinja2.filters:model_url_filter
    route_url = pyramid_jinja2.filters:route_url_filter
    static_url = pyramid_jinja2.filters:static_url_filter

絶対パスで指定してcssも綺麗に表示できて満足していたんですけども

1
2
<!-- Bootstrap -->
<link href="" rel="stylesheet"/>

そもそも

相対パスで指定すればいいじゃん…

1
2
<!-- Bootstrap -->
<link href="static/css/bootstrap.css" rel="stylesheet"/>

というそれだけでした。あ、はい、すいません

以上。

pyramid+mongodbのプロジェクトを 公式ドキュメントの MongoDB and Pyramid を参考にpyramid_mongodbのscaffoldを利用して作成しようとしたらエラーが出て手間取ったのでメモっておく

ひとまずPython2で

Python仮想環境を構築してpyramidpyramid_mongodbをインストールする

1
2
3
$ pyenv virtualenv 2.7.8 pyramid-mongo-27
$ pyenv activate pyramid-mongo-27
(pyramid-mongo-27)$ pip install pyramid pyramid_mongodb

利用できるスカフォードにpyramid_mongodbがあると思うので これを利用してプロジェクトを作成する

1
2
3
4
5
6
7
(pyramid-mongo-27)$ pcreate -l
Available scaffolds:
  alchemy:          Pyramid SQLAlchemy project using url dispatch
  pyramid_mongodb:  pyramid MongoDB project
  starter:          Pyramid starter project
  zodb:             Pyramid ZODB project using traversal
(pyramid-mongo-27)$ pcreate -s pyramid_mongodb pyramid-mongo

setup.pyから依存パッケージをインストールして

1
2
3
4
(pyramid-mongo-27)$ cd pyramid-mongo
(pyramid-mongo-27)$ python setup.py develop
...
Finished processing dependencies for pyramid-mongo==0.0

development.iniのmongodbの接続情報を編集

development.ini
1
2
3
4
5
[app:pyramid-mongo]
...
mongodb.url = mongodb://localhost
mongodb.db_name = mydb
...

サーバーを実行すると

1
2
3
(pyramid-mongo-27)$ pserve development.ini
Starting server in PID 8520.
serving on 0.0.0.0:6543 view at http://127.0.0.1:6543

ValueError: No such renderer factory .pt

とまあ、エラーになるわけですね…

エラーメッセージでぐぐってみると What’s New In Pyramid 1.5 が出てきて

Pyramid no longer depends on or configures the Mako and Chameleon templating system renderers by default.

とのことで、自分でテンプレートエンジンの設定を追加してあげればよい模様

setup.py
1
2
3
4
5
6
7
8
setup(
    #...
    install_requires=[
        'pyramid_chameleon',         # new dependency
        'pyramid',
        #...
    ],
)

再度setup.pyを実行(もしくは直接pipでインストール)する

1
(pyramid-mongo-27)$ python setup.py develop

__init__.pypyramid_chameleon行を追加

__init__.py
1
2
config = Configurator(.....)
config.include('pyramid_chameleon')

サーバー起動して確認してOK.

1
(pyramid-mongo-27)$ pserve development.ini

以上。

Pyramidのドキュメント読んでたら用語につまずいてしまったので整理。

トラバーサルってなに?

Much Ado About Traversal (翻訳)

Traversal is an alternative to URL dispatch which allows Pyramid applications to map URLs to code.

URLマッチングでは解決しにくい問題に対するもう一つのURL dispatcher。

自分の理解ではSAStrutsでは暗黙の規約となっている URLパスをパッケージ名に照らし合わせて特定のActionメソッドを呼び出すようなルールを 独自に定義して利用できますよ、といったところ。

URLマッチング

URLパスを解析しあらかじめ登録されたURLパターンと比較してマッチした場合に関連付けらた関数を呼び出す。 複数のパターンにマッチした場合の解決策は先着順であることが多い。

トラバーサル

ファイルシステム検索の仕組みのように 特定のリソースが特定のURLパスによって検索されるプロセス。

/joeschmoe/photos/photo1に対して以下の擬似コード、

1
get_root()['joeschmoe']['photos']['photo1']

に表現されるような辞書から返却されるリソースとして解決する。

リソースの辞書
  • ソース内に直接ハードコーディングされたサイトURL構造から
  • RDB等に永続化されたオブジェクトから
  • 特定ディレクトリのフォルダ構造から

といったように構築する。

ビュー検索

/joeschmoe/photos/photo1/edit に対するリクエストはトラバーサルによって 以下のようにリソースが検索されるが、

  • get_root() -> リソース
  • get_root()[‘joeschmoe’] -> リソース
  • get_root()[‘joeschmoe’][‘photos’] -> リソース
  • get_root()[‘joeschmoe’][‘photos’][‘photo1’] -> リソース
  • get_root()[‘joeschmoe’][‘photos’][‘photo1’][‘edit’] -> リソースでない

末端となるリソースが解決された時点でリクエストパス全体がまだ消費されていない場合に 直後のパスセグメントeditview nameとして扱われる。 photo1リソースをコンテキストとしてeditビュー(関数)が検索される。

1
2
3
4
context = get_root()['joeschmoe']['photos']['photo1']
view_callable = get_view(context, 'edit')
request.context = context
view_callable(request)

ユースケース

典型的にはCMSのようにURLパスがエンドユーザによって任意に作成されていく場合に URLパターンでは対応が不可能または複雑になることに対する解決策として導入する。

そうではないURL固定パターンでもサイト構造を辞書にハードコーディングしておけばいいので トラバーサルの仕組みでディスパッチしとけばよし。

用語がわからないだけで概念はあるあるでした。

以上。

Macにboot2dockerをインストールして nginxのDockerfileを作ってコンテナを起動してみる。

boot2docker

https://github.com/boot2docker/osx-installer/releases からBoot2Docker-1.2.0.pkgをダウンロードしてインストール。

boot2docker startでboot2docker用のVMが起動してdockerコマンドが利用できるようになる。

1
2
3
4
5
6
$ boot2docker start  
Waiting for VM and Docker daemon to start...
.................................
Started.
To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2375
1
$ export DOCKER_HOST=tcp://192.168.59.103:2375

Dockerfile

作業フォルダ作成

1
2
3
4
5
$ cd
$ mkdir nginx
$ cd nginx
$ echo 'Welcome Page!' > index.html
$ vim Dockerfile

Dockerfileの内容

1
2
3
4
5
6
FROM ubuntu:latest
MAINTAINER contee213
RUN apt-get update
RUN apt-get install -y nginx
ADD index.html /usr/share/nginx/html/
ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
  • FROMでBaseイメージの指定
  • MAINTAINERは自分の名前でも
  • RUNでコマンド実行
  • ADDでファイル追加
  • CMD/ENTRYPOINTdocker runするコマンドを定義ENTRYPOINTdocker runで上書きされない。

docker build

imageを作成

1
$ docker build -t contee213/nginx:1.0 .

docker run

コンテナ作成

1
$ docker run -d -p 80:80 --name nginx1 contee213/nginx:1.0

nginxの確認

boot2dockerのvmのipアドレスを確認

1
2
$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103

indexページにアクセス

1
2
$ curl 192.168.59.103:80
Welcome Page!

とりあえずこんな感じで。 後は少しずつ使っていこう。

Ubuntuで2系と3系の二つがあればいいっていう場合は 公式リポジトリから2つインストールすればいいですが 公式リポジトリにないバージョンのPythonをインストールしたいのなら Personal Package Archives(PPA)を利用するのが一番手っ取り早いですかね。

Old and New Python Versions https://launchpad.net/~fkrull/+archive/ubuntu/deadsnakes?field.series_filter=trusty

1
2
3
4
5
$ sudo apt-add-repository ppa:fkrull/deadsnakes
$ sudo apt-get update
$ sudo apt-get python2.6
$ sudo apt-get python3.2
$ sudo apt-get python3.3

2.6.XのX部分はマイナーバージョン内での最新のみの模様。

1
2
3
4
5
$ apt-cache showpkg python2.6
Package: python2.6
Versions:
2.6.9-2+trusty1 (/var/lib/apt/lists/ppa.launchpad.net_fkrull_deadsnakes_ubuntu_dists_trusty_main_binary-amd64_Packages)
...

バージョンが複数あるようであれば、package=versionで指定できる。

1
$ sudo apt-get install python2.6=2.6.9-2+trusty1

重要な環境に利用する場合はもちろん自己責任で。

If you want to use them in a security-or-otherwise-critical environment (say, on a production server), you do so at your own risk.

以上。