Python タグの一覧です(49 件)

[Python][Bottle]BottleでHTTPリクエストにおけるUser-Agentヘッダを取得する

BitbucketのWebhookサービスの送信元IPがマニュアルと違うもので送られてきて、いくら待ってもhookされないので、IPを当てにするのはもうやめようと思い、代わりにUser-Agent(それプラスJSONの内容)で判定することに。

とりあえずググったらすぐ発見。stackoverflowに出てました。

from bottle import request
ua = request.environ.get('HTTP_USER_AGENT')

因みにFlaskだとこのような感じになるようです。

from flask import request
ua = request.headers.get('User-Agent')

[Python]Shizuoka.py #2 に参加してFlaskについて話をしてきた

Untitled

Shizuoka.py #2 に行ってきました。またFlaskについて発表してきました。

会社でお偉いさん方にプレゼンすることは多々あれど、このような場で発表するのは初めてだったので、どのくらい笑いをとれるか心配でしたが、なんとか無事終えることが出来ました。


発表後、20分程で私の斜め後ろにいらっしゃったaodagさんがflaskからpyramidに書き換えてくれました


パーフェクトPython (PERFECT SERIES 5)
パーフェクトPython (PERFECT SERIES 5)

aodagさんが持参されたパーフェクトPython争奪じゃんけん大会で散ったので帰りのバスでamazonポチりました。じゃんけん大会を見事勝ち抜けてゲットされた@ringtaroさんおめでとうございます!

私以外の発表された方々のスライド(都度更新します)


javascriptも今年少しはやるつもりだったけど、今年も折り返し地点まできてしまったw



ちょっとVirtualBoxでサーバ立ててやってみようと思う。



パッケージングについて。正直ここまでたどりつけていないけど、ところどころは理解できた。今どのような状況なのかが整理されているので今後パッケージを作成することがあった場合、書籍やWebでパッケージングを調べる際、それが今有効なのかどうかを知るのにとても役立つと思った。

楽しかったので次回も参加出来たらまた何か発表したいです


[Python][Bottle]BottleでBitbucketのwebhookをレシーブする小さなウェブアプリを作った

bitbucketのソースコードの貼り付けがうまくいかないのでコピペして貼り付けます。

リポジトリはこちらです。ものすごく適当に作ってます。

このブログはFlaskで動いていて、リポジトリをBitbucketの非公開リポジトリにおいてあります。またそのリポジトリではデータベースであるsqliteのバイナリファイルもインディックスしています。

ブログを書いたり、レイアウトを変更したりする場合は、ローカルで動かして、作業をし、コミットしてpushします(ブログ更新だけ行った場合はバイナリファイルだけ更新されることになります)。そしてpushを感知したBitbucket側がwebhookにてJSONデータをこのウェブアプリに投げつけます。

POSTデータを受け取ったらブログのドキュメントルートからリポジトリをgit pullして更新する仕組みです。つでにwsgiファイルをtouchしてmod_wsgiをオートリロードさせています。

5/30追記 キャッシュの関係かリロード後、うまく反映しないのでapache restart とかに変更しています(泣)追記ここまで

本当はJSONファイルの中身をみて色々したいのですが現時点ではなにもしていません。


# -*- coding: utf-8 -*-

import os
from time import sleep
from subprocess import call
from bottle import route, post, get, request, run, redirect
from setting import PRODUCT, DIR, REMOTE_IP

@get("/hook")
def get_page():
    redirect("/")


@post("/hook")
def web_hook():
    remote_ip = REMOTE_IP
    req_ip = request.remote_addr
    if req_ip == remote_ip:
        os.chdir(DIR)
        call("/usr/bin/git --git-dir=.git pull", shell=True)
        sleep(1)
        call("/bin/rm -rf /tmp/cache/" + PRODUCT + "/*", shell=True)
        sleep(1)
        call("sudo /etc/init.d/apache2 restart", shell=True)
        return "OK"


@route("/")
def hello():
    req_ip = request.remote_addr
    return "Hello " + req_ip


if __name__ == '__main__':
    run()

Bottleを使ってみた理由はFlaskとどう違うのか見てみたかったことと、少し違うフレームワークを触って、よりFlaskの理解を深めたかったからです。

実際に触ってみてBottleはFlaskからみて、頭の良い、でもどこか天然入ってる弟みたいなフレームワークだと感じました。書き方がすごく似ていて兄弟みたいだなと。

頭が良いというのは、既にPython3.xに対応しているということに対する比喩です。天然入っているとは、1ファイルフレームワーク(ドヤ顔)って感じですが、ファイル見たら3,000行をゆうに超えていて、それ本末転倒じゃねえのって思ったからです。

あとスタティックファイルもルーティングする必要があるとか(Flask以外のフレームワーク触ったことがない人間にとって)そこは固定でいいよって思ってしまいました。

便利だなって思ったのはコマンドラインであれこれできたこと。たとえばこんなふうに

(bottle)aoshiman ~/dev/webhook(*'-')<python -m bottle --bind 127.0.0.1:5000 --debug --reload webhook

スクリプトにdebug=Trueとか、portは5000使えとか書いたり、本番環境向けに条件分岐とか書かなくてもよかった(FlaskではFlask-Scriptとかで出来るのかな?エクステンション無しでも可能?)

もう少し深く(出来ればこのブログをBottleに置き換えるくらい)やってみようかなと思います

[Python]virtualenvwrapperでworkonしたら自動的にプロジェクトフォルダに移動してついでにgitのリモートリポジトリの更新をチェックする

人生も折り返しを過ぎると脳の劣化が激しくて異常なくらい物忘れが起こるのですが、最近は自宅でこのブログなんかをカスタマイズしてbitbucketにpushしておいたことを会社ですっかり忘れてて昼休みとかに作業始めちゃって途中で気づいて慌てることが頻繁にあります。

作業始める時にリモートリポジトリを確認することを忘れないとかはもう無理なので、そのかわりプロジェクトフォルダでworkonしたらオートマチックにgitのリモートリポジトリの更新をチェックする(git fetch)ようにしました。

workonしたら自動的にプロジェクトフォルダに移動する

virtualenvwrapperのマニュアルにあるsetvirtualenvprojectを参考に

まずプロジェクトフォルダを作成します(プロンプトが可愛いのは気にしないで下さい)

aoshiman ~/dev(*'-') <mkdir testproject

次にtestというvirtualenvを作成し、その後testprojectフォルダに移動します。

aoshiman ~/dev(*'-') <mkvirtualenv test
New python executable in test/bin/python
Installing setuptools.............done.
Installing pip...............done.
Cleaning up...
(test)aoshiman ~/dev(*'-') <cd testproject/

testというvirtualenvにいる状態でsetvirtualenvprojectコマンドを実行して、testprojectフォルダとtestというvirtualenvを紐つけます

(test)aoshiman ~/dev/testproject(*'-') <setvirtualenvproject
Setting project for test to /Users/aoshiman/dev/testproject

いったんdeactivateし、ホームディレクトリに移動した後、workonしてみるとtestprojectフォルダに移動していることが確認出来ます。

(test)aoshiman ~/dev/testproject(*'-') <deactivate
aoshiman ~/dev/testproject(*'-') <
aoshiman ~/dev/testproject(*'-') <cd
aoshiman ~(*'-') <workon test
(test)aoshiman ~/dev/testproject(*'-') <

activateしたら自動的にgit fetchする

これはvirtualenvwrapperのhookscriptを使用します。

先程同様virtualenvwrapperのマニュアルにあるpostactivateを参照に以下の様に記述します。

aoshiman ~/dev/testproject(*'-') <cat ~/.virtualenvs/test/bin/postactivate
#!/usr/local/bin/zsh
# This hook is run after this virtualenv is activated.

/usr/local/bin/git --git-dir=$HOME/dev/test/.git --work-tree=$HOME/dev/test fetch

postactivateはグローバルとローカルにあります。全てのvirtualenvのactivate時にhookを適用する必要は無いはずなのでローカルに記述します。

多分これでやりたいことは実現できたと思います(fetchする時間分待たされるるけど仕方ないかな)。

[Python][Flask]ブログエントリーの経過時間を表示させる

ブログを再構築した際に追加した機能のひとつにブログエントリーの経過時間を表示させるってのがあります。

スクリーンショット 2013-05-13 20.27.39

こういうやつです。

これは、IT技術なエントリーを多めに掲載するブログなら、検索された時に経過時間が表示されたほうが良い(情報が古そうかどうかパッと判断できたほうが良い)と考えたからです。

元ネタはここです

ここでは、jinja2のカスタムテンプレートフィルタとして作成し、ツイッターのようなマイクロブログサービスにおけるタイムラインでの相対的な時間経過表示に使用するtipsになっていますが、私はそれをFlaskのflashで使用するようにカスタマイズしました。ついでに日本語ローカライズもしています(日本語は時間単位に複数形が無いのでコードが簡潔になりますね)。


上記コードはutils/timesince.pyなどにしておいて、これをアプリケーション側で以下の様に記述し

from utils.timesince import timesince

@app.route('/entry/<int:post_id>')
def show_entry(post_id):
    dt = Entry.query.filter_by(id = post_id).one()
    flash(u'%s' % timesince(dt.pub_date), 'alert-success')
    return render_template('show_entries.html',
        entries = Entry.query.filter_by(id = post_id).all(), tags=show_tags())

テンプレート側で以下の様に受け取ります

<div class="row">
            <div class="span9">
                {% for category, message in get_flashed_messages(with_categories=true) -%}
                <div class="{{category}}">{{message}}</div>
                {%- endfor %}
                {% block body %}{% endblock %}
            </div>
            <div class="span3">
                <div id="sidebar">
                    {% block sidebar %}{% endblock %}
                </div>
            </div>
        </div>

因みにFlaskのflashにはメッセージとともにカテゴリーを設定することが出来て、それもテンプレート側で受け取ることが出来ますが、私はカテゴリーにtwitter-bootstrapのAlertsで使用されるクラス名をそのまま使用しています。そうすることによってテンプレート側でのクラス名にそのまま利用することが出来るからです。

ここではAlertsのsuccessを使っていているので緑っぽいですが、infoだと青になると思います。

ちょっと色がトロピカルっぽいんでもう少し淡くしようかとも思っています。

PAGE TOP