Python+Bottle

Pythonとは

Pythonはプログラミング言語です。初心者からエキスパートまで広く使われているのではないでしょうか?

私はプログラムを作るときに、パフォーマンス重視のためC/C++をよく使いますが、ちょっとした物をつくるのにPythonを使うようになりました。

スゲー良いです。なにが良いかというと、ソフトを作ることに集中できるところですかね。

インデントの位置とかが言語仕様となっていて、公式なコーディング規約があるので、 宗教的な記述方法の対立に巻き込まれなくて良いのが良いです。

意外と速いし、ライブラリはタダでたくさんあるし、遅いところはCで書き直してしまえば良いというのも良いですね。

Bottleとは

Pythonで実行できる、軽量なwebフレームワークです。

フレームワークとは、

プログラミングにおいて、一般的な機能をもつ共通コードをユーザーが選択的に上書きしたり特化させたりすることで、 ある特定の機能をもたせようとする抽象概念のことである。(出典:Wikipedia)

こんな感じです。

私はweb系とは全く無縁の仕事をしているので、まずは簡単そうでかつ速そうなBottleを使って、webの世界を学んでいこうと思っています。

(フレームワークが速ければ、サーバも安いので済むし)

Bottleを使うのには、bottle.pyをDLしてきてサーバへファイルコピーするだけと、とても簡単です。

Bottleのサイトはこちらhttps://bottlepy.org

フレームワークでやること

このサイトで考えている、フレームワークの使い方を図にしてみました。

DB(データベース)に格納されているへぇカウンタは、へぇボタンに使います。

他には最新TOIPICのリストの表示、へぇランキングを表示、ブログなので同一カテゴリの表示等を行うためにDBを使用します。

DBのアクセスはPythonから行い、DBから取得した値と、TOPIC(記事)のファイル、テンプレ-トをBottleに渡すことで、 BottleがHTMLを作成してくれます。

テンプレートを変更することで、サイト全体のデザインをすぐ変えられたり、TOPICファイルは書きたいことのみに集中できます。

Bottleの威力

サンプルのコードは貼ります。

bottleを呼び出すコードとテンプレートです。たったこれだけでそこそこ動きます。

index.py(bottleを呼び出すコード)


#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import os
from bottle import route, run, template, static_file, error

@route('/')
def index0():
    return "index page"
    
@route('/')
def index0f(file):
    # データベースから読み出す部分
    col = [ "strAddr", "strTitle" ]
    row = []
    row.append(['2000-0101.html', 'サイト始めました'])
    row.append(['2000-0102.html', 'ドメイン取った'])
    row.append(['2000-0103.html', 'バグバグ'])
    row.append(['2000-0104.html', 'うまくいった?'])
    create = {'col':col, 'row':row}

    # 記事ファイルから読み出す部分
    text = "<h1>TOPIC</h1> TOPICの内容"    
    
    return template('index', text=text, create=create)


if os.path.isfile("index.cgi"):
    run(host='0.0.0.0', port=80, server="cgi")
else:
    run(host='localhost', port=8080, debug=True) #debug

index.tpl(bottleで実行されるテンプレート)


<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
	</head>
	<body>
		
		{{!text}}
		
		<table>
			<tr>
				<th class="able_title" >最新記事</th>
			</tr>
					
			%addr = create['col'].index('strAddr')
			%title = create['col'].index('strTitle')
			%for d in create['row']:
			<tr>
				<td><a href="{{d[addr]}}">{{d[title]}}</a></td>
			</tr>
			%end
		</table>
	</body>
	
</html>

上のコードをローカルサーバで実行し、chromeで表示するとこのようになりました。

index.pyのtemplate()でindex.tplを実行します。この時にtextとかcreateとかの変数を渡します。これはいくらでも変更できます。

index.tplの%の行はPythonの命令として実行可能です。htmlの中にpythonコードと変数を埋め込む形です。

{{xxx}}の部分は変数の中身(xxx)をhtmlに出力することができます。

index.tplの{{!text}}の部分がポイントなんですが、このtextという変数にhtmlを入れていると、 < >等がエスケープされてhtmlタグとして認識されません。変数の前に!をつけておくとエスケープされないので、必要に応じて使ってください。

Python+Bottleでアイデアさえあれば色々できそうです。細かいことはgoogle先生に聞いてください。

色々って?

背景が白い(明るい)サイトは昼間はいいのですが、スマホで夜に暗い部屋で見ていると目が痛くなります。

時刻によって色を変える「夜モード」とかは、Bottleでできそうです。毎回ランダムで色を変えるとかもできますね。