2020年11月6日金曜日

RaspberryPi 2B + Apache2 mod-wsgi + Flask Deploy + Form

ログインページを追加する。と言っても、名前を入力するフォームだけ。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 ページにもテンプレートを使うようにしてみてください。

0 件のコメント:

コメントを投稿