Bottle タグの一覧です(3 件)

[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')

[Bottle][Bitbucket]BitbucketのWebhook機能の送信元IPアドレスが変更されていた

前回書いたブログがGit Pushしても反映されないので反映されない原因を切り分けて調べていたら、なんのことはない、JSONをPOSTするBitbucket側の送信元IPアドレスが変更されていた。

原因が分かったのはいいのだけど、コロコロ変わってもらっても困るなあと。

送信元IPは見ないでJSONの内容チェックして判断させるのも手だけども。ちょっと考える。

[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に置き換えるくらい)やってみようかなと思います

PAGE TOP