2017/12/27

Bottle を動かそう。

フレームワークに手を出します。

今回はPythonのWebアプリケーションフレームワークBottleを動かしてみます。
今までPythonをCGIとして動かしてきましたが、
フレームワークをうまく使うと開発を高速化できるということがよくわかりました。

それでは本編です。

目次

目標

PythonのWebアプリケーションフレームワーク「Bottle」を動かす。

設定

今回は、「/var/www/webapp」以下に作ります。

ファイルの入手

以下のコマンドでbottle.pyを入手します。
cd /var/www/webapp
wget https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py

adapter.wsgiを準備

adapter.wsgiを作成します。
今回は以下のようにします。
#coding:utf-8

import sys, os

#adapter.wsgiの保存先のパスを取得
dirpath = os.path.dirname(os.path.abspath(__file__))
#ライブラリの読み対象パスにadapter.wsgiの保存先パスを追加
sys.path.append(dirpath)
#adapter.wsgiの保存先パスに移動
os.chdir(dirpath)

#Bottle.pyを読み込み
import bottle
#実行アプリケーションの本体app.pyを読み込み
import app

#アプリの実行
application = bottle.default_app()

app.pyを準備

アプリケーション本体app.pyを用意します。
#coding:utf-8
from bottle import route, run, template, request, HTTPResponse
from bottle import TEMPLATE_PATH

TEMPLATE_PATH.append("./view")

@route('/')
def outputdefalt():
    return "HELLO BOTTLE WORLD!"

@route('/text')
def outputtext():
    body = "テキストデータ"
    responce = HTTPResponse(status=200, body=body)
    responce.set_header('Content-Type', 'text/plain')
    return responce

@route('/json')
def outputjson():
    body = "{'data': 'jsonデータ'}"
    responce = HTTPResponse(status=200,body=body)
    responce.set_header('Content-Type', 'application/json')
    return responce

@route('/html/<name>')
def outputhtml(name):
    body = template('htmltpl',name=name)
    responce = HTTPResponse(status=200, body=body)
    responce.set_header('Content-Type', 'text/html')
    return responce

@route('/redirect')
def outputredirect():
    responce = HTTPResponse(status=302)
    responce.set_header('Location', 'https://www.google.co.jp')
    return responce


if __name__ == '__main__':
    run(host='xxx.xxx.xxx.xxx', port=80, debug=True, reloader=True)

テンプレートファイルを準備する。

/var/www/webappの下にviewというフォルダを作り、
viewフォルダの中に以下のような「htmltpl.tpl」というファイルを作ります。
<html>
    <head>
    </head>
<body>
    <h1>テストページ</h1>
        こんにちは{{name}}さん
    </body>
</html>

httpd.confを編集

adapter.wsgiを実行対象にするため、/etc/httpd/conf/httpd.confに以下を追加する。
(前回の記事を見た方は、書き換えになります。)
LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / /var/www/webapp/adapter.wsgi
設定はここまでです。
ここまでで「/var/www/webapp」は以下のようになっています。
.
|-- adapter.wsgi
|-- app.py
|-- bottle.py
|-- view
    |-- htmltpl.tpl

実行例-表示例

それぞれブラウザで確認してゆきます。
  • 「http://設定したサーバーのアドレス/」にアクセスします。
    「HELLO BOTTLE WORLD!」と表示されたでしょうか?
    これは、app.pyで @route('/') の時すなわち、ルートの時に、
    outputdelalt()が実行されて、文字列"HELLO BOTTLE WORLD!"が返されるからです。

  • 「http://設定したサーバーのアドレス/text」にアクセスすると、
    「テキストデータ」と表示されたはずです。 今回はただ文字列を返すだけではなく、レスポンスヘッダを追加しています。
    レスポンスヘッダはこちらの説明がわかりやすいと思います。
    「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
    要は返した文字列のメタデータを付与しているわけです。
    この場合、「text/plain」をつけて「テキストファイルです」という札をつけていることになります。

  • 「http://設定したサーバーのアドレス/json」にアクセスすると、
    json形式のデータがダウンロードされます。 これはレスポンスヘッダに「application/json」が付与されているからです。

  • 「http://設定したサーバーのアドレス/html/[文字列]」にアクセスすると、 以下のようなページが表示されます。 以下の表示の時は「http://設定したサーバーのアドレス/html/AXY」にアクセスしています。
    <name>の部分に入れた文字列の内容が、
    template([テンプレートのファイル名],[テンプレートの中の文字列挿入先]=[テンプレートに埋め込む文字列)
    で処理されることでhtmltpl.tplの{{name}}で指定された部分に<name>挿入されます。

  • 「http://設定したサーバーのアドレス/redirect」にアクセスすると、
    「https://www.google.co.jp」に転送されます。

終わりに

Bottleを導入してテキスト・HTML・JSON、そして外部へのリダイレクトを実装してみました。
CGIでページへの文字列の挿入や、JSONの応答を作っていたころと比べると、
ある程度型にはめる(まさにフレームワーク!)ことで、数行で実現できました。
フレームワークで開発を開発が加速するのもうなずける話ですね。
(きっと本業の人たちからすると、「当たり前でしょ?」って煽られそう・・・。)

今回はここまでです。
せっかくAWS EC2でサーバーもかまえたので、なにかサービス公開してみたい

ご参考になれば幸いです。
実行は自己責任で!

以上

0 件のコメント:

コメントを投稿

AWSに手を出してフレームワークも使ってみたが・・・。

サイトを作り直しました。 AWS上に構築した Content created by AXY を作り直しました。 具体的にはbottle.pyを使ったpythonで構築したサイトからPHP7を使用したサイトに再構築しています。 特別何か問題点があったというわけで...