Bottle/Pythonによる Webアプリ入門 東京海洋大学 久保幹雄
from bottle import route, run @route('/hello') def hello(): return "Hello World!" run(host='localhost', port=8080, debug=True) デコレータ(修飾子)@で 関数helloを実行するルートを指定 http://localhost:8080/hello にアクセスするとhelloを実行 ブラウザ http://localhost:8080/hello Hello World!
名前とパスワードを入力するタグとLoginボタンを配置 クライアントからのデータの受け取り (1) GETモード(既定値)で localhost:8080/login にアクセスすると, username と passward をGETして,フォームにpostする HTMLファイルを返す from bottle import route, request, run, template @route('/login') #@get(‘login’)でもOK def login(): return ''' <form action="/login" method="post"> Username: <input name="username" type="text" /> Password: <input name="password" type="password" /> <input value="Login" name="Login" type="submit" /> </form> ''' Formタグでフォーム を作る.データをフォームにpostする 名前とパスワードを入力するタグとLoginボタンを配置 ブラウザ http://localhost:8080/login Username Password Login
def check_login(username, password): if username=="kubo": return True クライアントからのデータの受け取り (2) 下で用いる関数 def check_login(username, password): if username=="kubo": return True else: return False POSTモードで localhosr:8080/login にアクセスすると, request.formsからgetメソッドで得られるusernameとpasswordを保管し, check_login関数でcheckして,メッセージを返す. @route(‘/login’, method=‘POST’) #@post(‘login’)でもOK def do_login(): username = request.forms.get('username') password = request.forms.get('password') if check_login(username, password): return "<p>Your login information was correct.</p>" return "<p>Login failed.</p>" Postされたデータ(forms辞書に保管されている)をgetメソッドで受け取る. キーはタグの名前(username, password) パスワードのチェック(ユーザー名がkuboなら真) HTMLのパラグラフのタグ<p>を返す.
ファイルアップロードのときにはenctypeを“multipart/form-data”に設定 ファイルのアップロード法 (1) GETモードで localhost:8080/upload にアクセスすると, username と passward をGETして,フォームにpostするための HTMLファイルを返す. from bottle import route, request, run import os @route('/upload') def upload(): return ''' <form action="/upload" method="post" enctype="multipart/form-data"> Category: <input type="text" name="category" /> Select a file: <input type="file" name="upload" /> <input type="submit" value="Start upload" /> </form> ''' ファイルアップロードのときにはenctypeを“multipart/form-data”に設定 Inputtypeをfileに設定
POSTモードで localhosr:8080/upload にアクセスすると, ファイルのアップロード法 (2) POSTモードで localhosr:8080/upload にアクセスすると, request.formsからgetメソッドで得られるusernameとpasswordを保管し, check_login関数でcheckして,メッセージを返す. filesに保管されたデータ(名前はタグ名のupload)を辞書のようにgetメソッドで得る @route('/upload', method='POST') def do_upload(): category = request.forms.get('category') upload = request.files.get('upload') name, ext = os.path.splitext(upload.filename) if ext not in ('.png','.jpg','.jpeg',".JPG"): return 'File extension not allowed.' save_path = "./" upload.save(save_path) return 'OK' ファイル名をfilename属性で得て画像ファイルでない場合にはメッセージを表示 saveメソッドでファイルを保存する.
template関数にHTMLの文字列(もしくはファイル)を入力すると整形してくれる テンプレートの使用法 @route('/') def do(): name = “Bob” return template( ''' <p>S Hello {{name }} </p> <% for i in range(3): print name, end basket=range(3) %> <ul> % for item in basket: <li>{{item}}</li> % end </ul> ,name=name ) HTMLを記述した文字列 {{ 変数名}}でPythonの変数を代入できる <% %>で囲んだ部分にPythonコードを埋め込める. ただし end が必要! % の右にPythonコードを埋め込める {{ 変数名}}でPythonの変数を代入できる ブラウザ出力Hello Bob ・0 ・1 ・2 名前付き引数としてプログラム内の変数を受け渡し