More than 1 year has passed since last update.

ケーススタディ

Webアプリの練習にPythonを勉強したい
Python3.4
Bottle
InteliJ
今回はローカル実行

簡単なコード

HelloWorld

Pythonのインストール等は簡単なので調べて下さい
基本的に brewやyumで簡単に入ります

virtualenvを使うとPython環境を汚さず便利というので
InteliJで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になっているので
モジュールとして使われた場合には実行したくないコードを書く事になる