ケーススタディ
Webアプリの練習にPythonを勉強したい
Python3.4
Bottle
IntelliJ
今回はローカル実行
簡単なコード
HelloWorld
Pythonのインストール等は簡単なので調べて下さい
基本的に brewやyumで簡単に入ります
virtualenvを使うとPython環境を汚さず便利というので
IntelliJでvirtualenvを使う方法は下記を参考に
http://qiita.com/todogzm/items/973f35e4f7f269062b8e
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 のテンプレートを作ります
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)
<html>
<head>
<title> test </title>
</head>
<body>
{% block content %} {% endblock %}
</body>
</html>
{% 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には モジュールと、モジュールをまとめたパッケージとがあるらしい
とりあえず簡単なほう、モジュール化をしてみます
メインの方は簡単に
import Sub
# 変数を使う
print(Sub.text)
# 関数を呼ぶ
Sub.printHoge()
# Classを使う
sub = Sub.Sub()
sub.printFoo()
# 変数
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になっているので
モジュールとして使われた場合には実行したくないコードを書く事になる