Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ケーススタディ

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

YukiMiyatake
C++が喋れる ゲームプログラマ インフラ、サーバ、UNITY、ゲームエンジンが最近多いな・・ MONA: MPpuEnmqDYBCxSZyG5cBDt6UWtXczmRmkn BTC: 13JpgsF3n6K2WhjEeUuUUqS7V71gWdFx56 BCH: 18q6rfi9ynyTgynrB8tJ2eSDLPQM32RZk5
http://murasame-labo.hatenablog.com/
murasame
ゲーム、エンタメ、サーバインフラ等 少人数で技術力の高い仕事をする会社
http://murasame-lab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした