Python
bottle.py

Python勉強1日目前半 Bottleで簡単なWebアプリ


ケーススタディ

Webアプリの練習にPythonを勉強したい

Python3.4

Bottle

IntelliJ

今回はローカル実行


簡単なコード


HelloWorld

Pythonのインストール等は簡単なので調べて下さい

基本的に brewやyumで簡単に入ります

virtualenvを使うとPython環境を汚さず便利というので

IntelliJでvirtualenvを使う方法は下記を参考に

http://qiita.com/todogzm/items/973f35e4f7f269062b8e


HelloWorld

import bottle

from bottle import route, run

@route('/hello')
def hello():
return "Hello World!"

run(host='localhost', port=1046, debug=True, reloader=True)


http://localhost:1046/hello

にアクセスすると HelloWorld! が表示されます

とてもシンプルですが見たまんま 

@routeでURLルーティングを指定し、実行してます

もちろん、動的ルーティングも出来るし

@get @post @put @deleteにすれば、各メソッドに対応できます

非常に簡単


テンプレートエンジン

Bottleではjinja2 が人気らしいので使ってみます

importでjinja2を指定し、テンプレートのパスも指定します

今回は動的ルーティングのテストとして /hello/<name> と nameを取りテンプレートに渡してみます

templateフォルダを作り以下に base.j2とhello.j2 のテンプレートを作ります


test.py

import bottle

import jinja2
from bottle import route, run
from bottle import TEMPLATE_PATH, jinja2_template as template

TEMPLATE_PATH.append("./template")

@route('/hello/<name>')
def hello(name):
return template('hello.j2', name=name)

run(host='localhost', port=1046, debug=True, reloader=True)



template/base.j2

<html>

<head>
<title> test </title>
</head>
<body>
{% block content %} {% endblock %}
</body>
</html>


template/hello.j2

{% extends "base.j2" %}

{% block content %}
Hello {{ name }}!
{% endblock %}


$ python test.py

で実行し、 localhost:1046/hello/hoge

でアクセスすると

Hello hoge!

と表示されるはず

フィーリングで読めると思いますが

test.pyから template関数で hello.j2を呼ぶ

引数に ダイナミックルーティング nameを渡す

hello.j2は base.j2を継承しており contentという変数にて bodyタグ内に埋め込まれる

よくある テンプレートエンジンの動作ですね!

実行すると

/xxx/pyenv/python3.4/lib/python3.4/site-packages/bottle.py:3325: DeprecationWarning: Absolute template path names are deprecated.

fname = self.search(name, self.lookup)

などと表示されます


if os.path.isabs(name) and os.path.isfile(name):
depr('Absolute template path names are deprecated.') #0.12
return os.path.abspath(name)

どうやらここでメッセージ出ているみたいですが、よくわかりません。

おそらくbottle0.12から 仕様が変わったんでしょう

現状動いているので とりあえず放置・・・


モジュール作成

pythonには モジュールと、モジュールをまとめたパッケージとがあるらしい

とりあえず簡単なほう、モジュール化をしてみます

メインの方は簡単に


main.py

import Sub

# 変数を使う
print(Sub.text)

# 関数を呼ぶ
Sub.printHoge()

# Classを使う
sub = Sub.Sub()
sub.printFoo()



Sub.py


# 変数
text="TEXT"

# 関数
def printHoge():
print("Hoge")

# class
class Sub:
def __init__():
pass
def printFoo():
print("Foo")


とりあえず、これぐらい知識があれば、ちょっとしたものなら作れそうですね

つぎはTwitterでも叩いてみようと思います

内容が大きく変わるので

1日目前半おわり


おまけ if name == "main":

よくpythonコードで

if __name__ == "__main__":

を見かけるが、ひとことで言うと、コマンドから実行された場合のみこの文がTrueになる

逆に言えば、モジュールとしてimportした場合にはFalseになっているので

モジュールとして使われた場合には実行したくないコードを書く事になる