LoginSignup
11
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-02

ケーススタディ

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になっているので
モジュールとして使われた場合には実行したくないコードを書く事になる

11
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
15