Python & Django 読んでおきたいエントリー
ここ一年ほど、Python&Djangoをやってきて気になったエントリー集。けっこう好きになった気がする > Python。壮大なフレームワークなんだねと実感してきた > Django。
読破したというより、読んでみたいがメインではあります。あと、Pythonメインの選定になってる。
Python
PHP, Perl , JSプログラマーが、Pythonを初めて一ヶ月ではまったポイントなどを整理してくれている、2010年のエントリー。is in 演算子とか、switchがないとか。「 x = 'foo' if <条件式> else 'bar' 」は、三項演算子だったかぁと気づいたり(いまさら。。。)
「 x, y = y, x 」で値の入れ替えを行ったり、スライスの「 items[start:end:step] 」 step を指定して、飛び飛びの値を指定できる。「from xxx import (x, y, z)」 が流行りとあり、トレンドってあるんだなぁと知りました。
AWS SDK for PHP 2 / 3 ドキュメント作成環境
mysqlclient / MySQL-python コンパイルエラー対処
Redhat w/SCL + pip で、Django/python の MySQLドライバ mysqlclient / MySQL-python がインストール出来なかった対処メモ。
SCLの問題というか、Redhatのrpmパッケージの考え方の問題なのかな?
# MySQL の mysqlclient と python と名前が被って若干混乱
状況と解決
pip でインストールをすると gcc が走ってコンパイルを行うのですが、どちらのドライバも同じ所で失敗してしまってました。
gcc -pthread -shared build/temp.linux-x86_64-2.7/_mysql.o -L/opt/rh/mysql55/root/usr/lib64/mysql -L/opt/rh/python27/root/usr /lib64 -lmysqlclient -lpthread -lz -lm -lrt -lssl -lcrypto -ldl -lpython2.7 -o build/lib.linux-x86_64-2.7/_mysql.so /usr/bin/ld: cannot find -lmysqlclient
mysqlclient でググルと、MySQL-develと一緒に提供があるとの情報と、libmysqlclient.so によるとある。
flake8 2.5.0 のエラー対処 on Ubuntu
Ubuntu に pip で flake8 を入れたら、上手く動かなかった。次の対処で上手く動作したのでメモ。
対処1
設定ファイル書くか -j0 オプション付けて並列処理をなくしたら動作。
vi ~/.config/flake8 [flake8] jobs = 1
$ cat /etc/os-release NAME="Ubuntu" VERSION="14.04.3 LTS, Trusty Tahr" $ python -V Python 2.7.6 $ flake8 --version 2.5.0 (pep8: 1.5.7, pyflakes: 1.0.0, mccabe: 0.3.1) CPython 2.7.6 on Linux
対処2
あとから、apt-get でインストールしたらよかったと気づいた。。。
こっちのバージョンだと jobs オプションがないようなので、さっきのファイルは削除。
sudo apt-get install python-flake8
$ flake8 --version 2.1.0 (pep8: 1.4.6, mccabe: 0.3.1, pyflakes: 0.8.1) CPython 2.7.6 on Linux
Ubuntu 側でパッケージが用意されてる見極めって、どのラインなんですかね?CentOSと両方使ってると、ついつい pip からはいってしまう。
Djangoアプリ全体で使う変数をコンテキストプロセッサで提供
組み込み Template とかをみてると {{ MEDIA }} とかが出てきますが、これを自前で作る方法。同じアプリを複数サイトで立ち上げる必要が出てきて、区別の為、アプリごとにユニークな名前を表示したい。ただ、それだけの用途に使いました。
(Django 1.7 の admin のように基底クラスの中で変数を定義して継承、もしくはCookieに値をセット、なども気づいたのですが、今回は修正が少なくて済む context processor を用意する方法を選択)
環境:
Template と Context
Template 上で扱いたいオブジェクトや値は、Viewからcontextに入れて渡すというのが通常の流れ。
view.py
class IndexView(TemplateView): template_name = 'index.html' ... context['application_name'] = 'HogeHoge'
app/templates/index.html
<h1>{{ application_name }}</h1>
しかし、全Viewに対してアプリ名を渡すとなると、各Viewのcontextにアプリ名を渡していく修正が発生するので手間がかかる。
Context Processor で Context に値を追加
そこで、新しく必要な値を渡す コンテキスト プロセッサを作り、context を生成する度に、特定の変数を渡せるようにします( {{ MEDIA }} のような)。