pythonその5 django
公式のチュートリアルに沿って学習中。runnserverのパラメタ指定とかufwに穴開けたりとかいろいろあったけど、書いてたのが消えたので、途中から。
returnの後にコード書いてる以下はなんなんだ?
メソッドのdefの外だし、いつ実行されるんだろう?
def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) was_published_recently.admin_order_field = 'pub_date' was_published_recently.boolean = True was_published_recently.short_description = 'Published recently?'
検索するフィールドや過去何日間の記事に絞るとか、そういった機能は追加するのが直感的に分かって、やってて面白かったけど、データのリレーションの定義はrailsの方が優しいような気がした。チュートリアル2の最後はインストールしたファイルをいじるようなことを書いててやめた。日本語ドキュメントを読めば分かるかもしれないけど、負けたような気がするのでやめておく。
チュートリアル3のviewを追加したけど期待通りに動作しないところで、一旦ギブアップ。
Related posts
gunicornの設定
djangoで何か作って運用するための準備としてgunicornを使ってみた。 gunicorn トップページには簡単に動きまっせみたいなことを書いているが、3晩はかかった。仕事だとしたらば1日潰れたぐらい時間がかかった。 まずはvagrantで動いてるubuntu 14.04にインストール $ pyenv shell 3.4.3 $ pip install gunicorn つづいてサンプルアプリの写経 ~/src/gunicorn/myapp/myapp.py def app(environ, start_response): data = "Hello World!\n" start_response("200 OK", [ ("Content-Type", "text/plain"), ("Content-Length", str(len(data))) ]) return iter([data]) 動かしてみると、おー動く。 unicorn -w 4 myapp:app [INFO] Listening at: http://127.0.0.1:8000 (13232) でもブラウザからは動作はしない。vagrantのポートフォワードの設定をしてもダメ。webサーバ、うちの場合はnginxの設定も必要らしい。 gunicornのインストール | i2bsの日記 なんとなく真似てgunicornのグループを作成して、vagrantユーザを所属させてみたが、結局confの設定は正しく読めなかった。 nginxの設定もunixドメインソケットのupstreamの設定がキモっぽいがsite-available/defaultに書いてると、/var/log/nginx/error.logに以下のエラーが出てnginxが起動しない。 "upstream" directive is not allowed here ググってみるとどうもバーチャルホストの設定が必要らしくconf.d/になんか書く必要があるとのこと。参考にさせてもらったサイトでもよくみるとそうなってたので、そのようにした。でもconf./dの設定とsites-availableの設定の関係性が分からなくなった。 confの設定がどうも効かないので、CLIから直接起動。アプリを書いたディレクトリで、以下を叩く。 unicorn -b "unix:/tmp/gunicorn.sock" myapp:app 今度はListeningのlogが変わった。 [INFO] Listening at: unix:/tmp/gunicorn.sock (13277) がしかし、http://127.0.0.1:18000/にアクセスすると、gunicornのアプリがエラーする。(18000はvagrantへのhttpアクセスのport forwardの設定port) [ERROR] Error handling request Traceback (most recent call last): File "/opt/pyenv/versions/3.4.3/lib/python3.4/site-packages/gunicorn/workers/sync.py", line 177, in handle_request resp.write(item) File "/opt/pyenv/versions/3.4.3/lib/python3.4/site-packages/gunicorn/http/wsgi.py", line 326, in write raise TypeError(‘%r is not a byte’ % arg) “gunicorn type error not a byte”でググって、stackoverflowで解決。 gunicorn (Python3.4 and 3.3) sends in response only headers without data | stackoverflow 元のアプリがpython 3系だとダメらしい。以下のresponseとおぼしき1行を修正してブラウザからの動作は確認できた。 – return iter([data]) + return [bytes(data, ‘utf-8’)] 残すは設定ファイルからのgunicorn起動。 2015/10/05追記 設定ファイル書けた。たぶんファイルのパーミッションの問題で、daemon化ができていなかった。以下は動作が確認できたファイルで、logファイルは先に作成して、chmod 666した。 import multiprocessing bind = ‘unix:/tmp/gunicorn.sock’ workers = 2 worker_class = ‘sync’ worker_connections = 1000 max_requests = 1000 timeout = 30 keepalive = 2 debug = False spew = False prelood_app = True daemon = True pidfile = ‘/tmp/gunicorn.pid’ umask = 0 #user = ‘vagrant’ #group = ‘gunicorn’ accesslog = ‘/usr/local/gunicorn/logs/access.log’ errorlog = ‘/usr/local/gunicorn/logs/error.log’ loglevel = ‘info’ proc_name = ‘gunicorn’ なお確認したソフトのバージョンは、以下。 python 3.4.3 nginx 1.4.6 gunicorn 19.3.0
pythonその4 環境周りとdjangoインストール
ファイルの先頭行に何を書くのか? 直接実行したい時は以下を書くと良い。 #!/usr/bin/env python 具体的には直接実行しないクラスを書いたファイルには不要。 デフォルトエンコーディングは書いておいた方が良さそう。 # -*- coding: utf-8 -*- rubyでのrbenvみたいなのは? わたしゃさくらのvpsにubuntu 14.04.02 LTSを入れて学習中。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS" なのですが、既に以下の状態。ここから実行環境の切り替えとかできるんだろうか… $ find /usr/bin -name "python*" | xargs ls -l lrwxrwxrwx 1 root root 9 Dec 21 2013 /usr/bin/python -> python2.7 lrwxrwxrwx 1 root root 9 Dec 21 2013 /usr/bin/python2 -> python2.7 -rwxr-xr-x 1 root root 3345416 Jun 23 03:51 /usr/bin/python2.7 lrwxrwxrwx 1 root root 9 Mar 23 2014 /usr/bin/python3 -> python3.4 -rwxr-xr-x 2 root root 4061272 Jun 20 00:35 /usr/bin/python3.4 -rwxr-xr-x 2 root root 4061272 Jun 20 00:35 /usr/bin/python3.4m lrwxrwxrwx 1 root root 10 Mar 23 2014 /usr/bin/python3m -> python3.4m rubyのrbenvみたいなのは、direnvかpyenvらしい。virtualenvはその前みたい。誰かその辺の歴史みたいなのとかまとめてくれんかな。direnvはpythonもrubyもまとめて面倒みまっせ的なものみたいだけど、既にrbenvは導入済だし、今回はpyenvでやってみることにする。他の人のやり方を見つつ、以前にrbenv入れたのをhistoryで推測しながら以下を実行した。 % cd /opt % sudo git clone git://github.com/yyuu/pyenv.git pyenv % sudo groupadd pyenv % sudo gpasswd -a ユーザ名 pyenv % sudo chgrp -R pyenv pyenv % sudo chmod -R g+rwxXs /opt/pyenv % sudo mkdir /opt/pyenv/shims % sudo mkdir /opt/pyenv/versions % sudo chmod -R g+rwxXs /opt/pyenv/shims % sudo chmod -R g+rwxXs /opt/pyenv/versions % echo ‘export PYENV_ROOT="/opt/pyenv"’ >> .zshrc % echo ‘if [ -d "${PYENV_ROOT}" ]; then’ >> .zshrc % echo ‘ export PATH=${PYENV_ROOT}/bin:$PATH’ >> .zshrc % echo ‘ eval "$(pyenv init -)"’ >> .zshrc % echo ‘fi’ >> ~/.zshrc % source ~/.zshrc なお、参考にさせていただいたのは以下でございます m(. .)m Ubuntu 12.04でpyenvを利用して速攻でPython3.4 + Nginx + uWSGI + FlaskなWebアプリケーション実行環境を作る (Qiita) Ubuntuにpyenvを用いてpythn環境を構築しました。(たくのこWeb) /usr/binにインストールされているpythonは置いといて、version 3.4.3をインストール。インストール前にdjangoとversionの整合性は確認した。インストールにはそこそこ時間かかる。何やらWARNINGが出てるが、気にしないったら気にしない。 % pyenv install 3.4.3 Downloading Python-3.4.3.tgz… -> https://yyuu.github.io/pythons/4281ff86778db65892c05151d5de738d […]
pythonその8 リフレクション
リフレクションに挑戦。 javaならnewinstance()するのだけど、pythonはイマイチよく分からない。 type()使うんかなー思ってやってみたけど、違うくさい。 2015/8/28追記 でけた。 from X import Y をハードコーディングしているバージョンはこちらで、そこも__import__で動的に読み込めるようにしたのがこれ。 よくわからなかったのは、関数名と機能が結びつかない点。getattrとかglobalsとか言われてもピンとこなかった。
Trackbacks and Pingbacks on this post
No trackbacks.
- TrackBack URL
Comments on this post