祢占堂

はい

Django で唐揚げ作った

この記事は 2012 Pythonアドベントカレンダー 11日目の記事です。

作りました

唐揚げです。

f:id:drillbits:20121211222932p:plain

django-karaage

PyPI にはあげてないので github から pip install してください。

$ pip install git+git://github.com/drillbits/django-karaage.git#egg=django-karaage

Django の settings.py にミドルウェアとして追加します。

MIDDLEWARE_CLASSES = (
    # 略
    "django_karaage.middleware.KaraageMiddleware",
)

生成したページすべてに唐揚げができます。

Before

f:id:drillbits:20121211222925p:plain

After

f:id:drillbits:20121211222932p:plain

よかったですね。

settings.py に KARAAGE_IMAGE_URL を指定するとお好みの唐揚げにもできます。

KARAAGE_IMAGE_URL = "http://ka.raa.ge/whatyoulike.jpg"

How To Karaage

Django のミドルウェアは view が response オブジェクトを返したところをフックできるので、そこで response.content に karaage.js をぶちこんでいるだけです。

django_karaage/middleware.py

karaage.js のなかでは jQuery を読み込んで、あとは Jimmy Wales のパクリをやってます。

django_karaage/karaage.js

せっかくなので

Cookpad にも載せました。

http://cookpad.com/recipe/2055269

つくれぽお待ちしております。

追記 2012/12/12 16:55

削除されたので楽天レシピにしておきました。

http://recipe.rakuten.co.jp/recipe/1330005112/

なんかいつのまにか消されてました。

Python mini hack-a-thon 夏山合宿 で書いた jQuery Plugin

を Github にあげるなどした。

縦置きのメニューにマウスオーバーするとビャッとサブメニュー的なものがスライドアウトする感じのやつです。

政治的な理由でソース本体に日本語でもっさりコメント書いてあります。

https://github.com/drillbits/jquery.boxvertmegamenu

デモは Github Pages です。

似たようなものは探したのですが、最新版の jQuery で動かなかったりなんか色々あって作ることになりました。以下のような動きをします。

  • メニューのうちのどれか(メニューアイテム)に mouseover すると、子要素のボックス(サブメニュー)が右側にスライドアウトして出てくる
  • そのときのサブメニューの縦幅は子要素の大きさに関係なく、メニューの縦幅と同じになる
  • 上下の別のメニューアイテムに mouseover すると、子要素は切り替わるがサブメニュー自体はスライドインしない
  • メニューとサブメニューから mouseout したときにはじめてサブメニューがスライドインする

最後のやつがイベントでうまく処理できなくて、結局メニュー+サブメニューの範囲の座標から外れたらスライドイン、みたいなことをしてます。つらい。

この jQuery Plugin は当初 Bitbucket T シャツを着て書かれていましたが、長野が涼しかったため、その上に Github パーカーを羽織った状態で書かれました。

Python mini hack-a-thon 夏山合宿
長野、涼しくて快適でした

buildout で Pyramid のテストコマンドを作る

前回までのあらすじ

buildout を使って Pyramid の環境を構築したねじだが、朝方剥いた桃がすごい速さで変色していくのにびっくりした。

あわせて読みたいbuildout を使って Pyramid な環境を構築してみた

Pyramid でのテストの実行

チュートリアルにあるように、setup.py test とか nose でテストができる。

これを buildout 使った場合はどうやるのかと思ったら、zc.buildout.eggs に nose とか追加するのじゃなくて、pbp.recipe.noserunner というレシピがあるらしい。

というのに @aodag 先生の公開してる papyrus の buildout.cfg を見て気づきました。なのでパクります。

bin/test コマンドの作成

buildout.cfg に以下のセクションを追加します。parts への追記も忘れずに。

[test]
recipe = pbp.recipe.noserunner
eggs =
    coverage
    kusaba
defaults =
    src/kusaba
    --with-doctest
    --cover-package=kusaba
    --cover-erase
    --with-coverage

${kusaba:eggs} という変数は [kusaba] セクションに別れてないとできないっぽいです。しかし [pyramid] セクションと一緒にしないとパス通らないのよね…

ともあれ、これで bin/buildout すれば bin/test コマンドができますよ。実行するとこんな感じです。

$ bin/test
.
Name                          Stmts   Miss  Cover   Missing
-----------------------------------------------------------
kusaba                           11      7    36%   9-15
kusaba.models                    14      0   100%   
kusaba.scripts                    0      0   100%   
kusaba.scripts.initializedb      22     14    36%   19-22, 25-35
kusaba.views                     11      2    82%   15-16
-----------------------------------------------------------
TOTAL                            58     23    60%   
----------------------------------------------------------------------
Ran 1 test in 1.560s

OK

ウヒョー

buildout を使って Pyramid な環境を構築してみた

あらすじ

ひさびさに行った液Py読書会が buildout だったし、せっかくなのでねじは Pyramid で何か作るついでに試してみようと思いました。

調べながら紆余曲折してたのそのままメモしていくので、おかしいところあったら東京湾に沈めてください。

ちなみに今回作るアプリケーションの名前は `kusaba` です。VirtualBox 上の Ubuntu 12.04 で作業してます。Python のインストール等はPythonプロフェッショナルプログラミングっていう本に書いてあるから5冊くらい買って参考にするといいですよ。


Pythonプロフェッショナルプログラミング
ビープラウド
秀和システム
売り上げランキング: 87408

なにはともあれ virtualenv

なんかあとになってからいらないかもと思いましたが、いつも使ってるので!いつも使ってるので!

$ mkvirtualenv kusaba
(kusaba)$ 

以降 (kusaba) は省略して書いていきます。

buildout 環境の作成

まず作業用ディレクトリをば。

$ cd ~/
$ mkdir kusaba
$ cd kusaba

bootstrap.py を取得して実行。`-d` は distribute を使うアレです。

$ wget "http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py"
$ python bootstrap.py -d init

ここで大量に

warning: foobar: byte-compiling is disabled, skipping.

やら

warning: no files found matching '*.txt'

やら

Download error on http://example.com: timed out -- Some packages may not be found!

やら出ますがひとまず放置してます。気になって自主的に調べた人は先生怒らないから正直に教えて下さい。

依存パッケージは、ここで作成される eggs ディレクトリに全部はいります。site-packages には入らないので、なんていうか virtualenv いらないですね…

使用する Python のバージョンも bootstrap.py init したときのやつになるっぽいです。ためしに virtualenv 環境でわざわざ /usr/bin/python2.7 bootstrap.py init とかやったら、bin/py の一行目はちゃんと #!/usr/bin/python2.7 になってました。

Pyramid をインストール

buildout.cfg を以下のように編集して、

[buildout]
parts =
    pyramid

[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid

環境をビルドします。

$ bin/build
Uninstalling py.
Installing pyramid.
Generated script '/home/drillbits/kusaba/bin/ptweens'.
Generated script '/home/drillbits/kusaba/bin/proutes'.
Generated script '/home/drillbits/kusaba/bin/pshell'.
Generated script '/home/drillbits/kusaba/bin/prequest'.
Generated script '/home/drillbits/kusaba/bin/pviews'.
Generated script '/home/drillbits/kusaba/bin/bfg2pyramid'.
Generated script '/home/drillbits/kusaba/bin/pcreate'.
Generated script '/home/drillbits/kusaba/bin/pserve'.
Generated interpreter '/home/drillbits/kusaba/bin/py'.

Pyramid の依存パッケージが eggs に入るほか、pip でやると ~/.virtualenv/kusaba/bin に入るコマンドが buildout 環境の bin 配下に入ります。

* Pyramid プロジェクトの作成

チュートリアルを参考にして作ります。virtualenv だと pcreate って打てばよかったコマンドが buildout 環境の bin/pcreate だったりするだけです*1

src というディレクトリを切って、その中に Pyramid プロジェクト `kusaba` を作ることにしました。

$ mkdir src
$ cd src
$ ../bin/pcreate -s alchemy kusaba

階層潜ったので ../bin です。本来ならここで setup.py develop ですが、読書会で清水川先生が「buildout はとにかく setup.py を叩いてくれる」と仰ってたので、そっちでやってみます。

[buildout]
parts =
    pyramid
    kusaba
develop =
    src/kusaba

[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid

[kusaba]
recipe = zc.recipe.egg
interpreter = py
eggs =
    kusaba

ビルドしまう。

$ cd ../
$ bin/buildout
:
Generated script '/home/drillbits/kusaba/bin/initialize_kusaba_db'.
:

DBの初期化コマンドも無事できました。ところでこれちゃんと setup.py develop なんですかね。 setup.py install だったりしないですかね。

Pyramid アプリケーションの起動

ここもチュートリアルに従います。まずはDBの初期化。

$ bin/initialize_kusaba_db src/kusaba/development.ini

そして起動!

$ bin/pserve src/kusaba/development.ini
Traceback (most recent call last):
  File "bin/pserve", line 23, in <module>
    sys.exit(pyramid.scripts.pserve.main())
:
  File "/home/drillbits/.buildout/eggs/distribute-0.6.28-py2.7.egg/pkg_resources.py", line 588, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: waitress   

はいきた。エラーきました。

waitress 自体は eggs にあるのですが、どうも bin/pserve がパスを通してないっぽい…

のでとりあえず buildout.cfg の pyramid セクションに追加。

# 前略
[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid
    waitress
# 後略

再びるど。

$ bin/buildout
:
$ bin/pserve src/kusaba/development.ini
Traceback (most recent call last):
  File "bin/pserve", line 23, in <module>
    sys.exit(pyramid.scripts.pserve.main())
:
  File "/home/drillbits/.buildout/eggs/distribute-0.6.28-py2.7.egg/pkg_resources.py", line 588, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: kusaba

どうやら同じセクションにないといけないっぽいので kusaba セクションを削除して pyramid セクションと統合。

[buildout]
parts =
    pyramid
develop =
    src/kusaba
 
[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid
    waitress
    kusaba

ふたたびるど。

$ bin/buildout
:
$ bin/pserve src/kusaba/development.ini
Starting server in PID 15162.
serving on http://0.0.0.0:6532

ウォァァァァァァ動いたようです。

とはいえ依存の書き方とかこれでいいのかいまいち謎なのでニントモカントモな感じはしますね…

あと setup.py test とかでやるテストはどうやるんだろう。

*1:チュートリアルよく見たらこっちも bin/pcreate とかしてますね…でもどのディレクトリに移動しても bin/コマンド になってるしよくわかんないです。