ログインページを追加する。と言っても、名前を入力するフォームだけ。POST の処理をやってみる。どこかのページにあったものをそのまま使っている。
ただし、デプロイすると動かなくなったのでいろいろ修正している。
ディレクトリ構造は、次のとおり。
|____my_globals.py |____static/ |____my_app.py |____templates/ | |____login.html |____login.py |____my_app.wsgi
・flask/my_globals.py 未使用。
・flask/my_app.py
login.py の success と login に対して、add_url_rule でパスの設定をしている。
@app.route() を使うよりも、まとめておいた方が分かりやすそうということで、ここに記述している。
from flask import Flask import sys import login app = Flask(__name__) # @app.route('/hello') def hello_world(): msg = 'Hello Flask ' + sys.version return msg if __name__ == '__main__': app.add_url_rule('/', 'hello', hello_world) # login.py app.add_url_rule('/success/<name>', 'success', login.success) app.add_url_rule('/login', 'login', login.login, methods=['POST', 'GET']) app.run(host='0.0.0.0', port=5000)
・flask/login.py
login フォームを表示するときに、テンプレート login.html を使用している。
from flask import Flask, redirect, url_for, request, render_template # @app.route('/success/<name>') def success(name): return 'welcome %s' % name # @app.route('/login', methods=['POST', 'GET']) def login(): if request.method == 'POST': user = request.form['nm'] return redirect(url_for('success', name=user)) else: # http://localhost:5000/login?nm=your_name user = request.args.get('nm') if user is None: return render_template('login.html') else: return redirect(url_for('success', name=user))
・flask/templates/login.html
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> </head> <body> <div> <form action="/login" method="post"> <p>Enter Name:</p> <p><input type="text" name="nm" /></p> <p><input type="submit" value="submit" /></p> </form> </div> </body> </html>
・flask/my_app.wsgi
ここで、 app.add_url_rule() をしている。 my_app.py 内では、うまくいかなかった。これで良いのか不明。
import sys sys.path.insert(0, '/home/pi/flask/') from my_app import app as application # add url rules app = application import my_app app.add_url_rule('/', 'hello', my_app.hello_world) import login app.add_url_rule('/success/<name>', 'success', login.success) app.add_url_rule('/login', 'login', login.login, methods=['POST', 'GET'])
勝手に演習
success ページにもテンプレートを使うようにしてみてください。
success ページにもテンプレートを使うようにしてみてください。