こんにちは。
今回の記事では、GET/POSTを同一のメソッドで処理する方法を書きたいと思います。
今までは、別の関数を定義して、処理していましたが、同一のメソッド内で処理することもできます。
関数別で処理する場合と、同一メソッド内で処理する場合に2つのコードを書きます。
あと、この方法だと送信した値を保管できないため、対処方法も一番下に書きます。
この記事が誰かの役に立ったら幸いです。
別関数でGET/POSTを定義する
まず、最初に別の関数でGET/POSTを定義した場合について説明する。
コード
コードは以下で書くことができる(対象箇所のみ抜粋)。
@app.route('/', methods=['GET']) def index(): return render_template('next_bf.html',\ title='Next page',\ message='Before Sample' ) @app.route('/', methods=['POST']) def form(): send = request.form['send'] return render_template('next_bf.html',\ title='Next page2',\ message="Before Sample,%s" % send )
GETは関数indexで定義し、POSTは関数formで定義している。
URLはともに、’\’にしておき、Sampleなので、参照するhtmlも同一にしている。
POST側では、ユーザーの入力値を変数sendで定義しておいて、その変数を表示できるにしている。
これが、私が今までやっていたGETとPOSTの書き方。
次に同一メソッドで定義する方法を書く。
同一メソッドでGET/POSTを定義する
同一メソッドで書いたコードは以下(対象箇所のみ抜粋)。
class testget(MethodView): send ='' def get(self): return render_template('next.html',\ title='After Sample',\ message='test',\ send=testget.send ) def post(self): testget.send = request.form.get('send') return render_template('next.html',\ titile='After Sample',\ message='you send:'+ testget.send,\ send=testget.send) app.add_url_rule('/af/', view_func=testget.as_view('af'))
これは「クラスの定義」と「登録」の2つで構成されている。
クラスの定義では、「MethodView」というクラスを継承しており、flask,viewsモジュールに用意されているクラス。これを継承すると、そのクラスには「HTTPメソッドに対応するメソッド」が用意できる。
こうして定義されたたクラスは、Flaskの「add_url_rule」というメソッドで登録し、引数にはクラスを登録するパスをテキストで指定する。
また、view_funcという引数には、クラスの「as_view」メソッドの戻り値をする。(名前は何でもよい)
クラスの定義方法
class クラス(MethodView):
def get(self):
GET時の処理
def post(self):
POST時の処理
で定義できる。
登録方法
app.add_url_rule(‘パス’,vie_func=クラス.as_view(名前))
で登録できる。
送信した値を保管する方法
上で書いたGE/POSTを同一メソッドで定義した場合、送信した値を保管できないため、保管できる方法も書いておく。
セッションを利用して送信した値を保管する
セッションというのを利用して保管することができる。
セッションは、sessionというオブジェクトとして用意されており、session自体が辞書のように機能する。
session[**]という形で値を保管したり、出力したりすることができる。
さらに、popメソッドにより値を削除することできる。
popは第一引数に指定した値をセッションから削除し、その値を返す。もし値が存在しない場合は、第2引数の値を返す。
セッションへの値の保管
session[キー] = 値
セッションの値の取得
変数 = session[キー]
セッションの値の破棄
session.pop(キー,値)
Sampleコード
セッションを利用したコードを載せておく。
from flask import Flask, render_template, request, session , url_for, redirect from flask.views import MethodView import random app = Flask(__name__) app.secret_key = b'random string...' class testget(MethodView): send ='' def get(self): if 'send' in session: msg = 'send:'+session['send'] send = session['send'] else: mseg="Can you write anything?" send='' return render_template('next.html',\ title='After Sample',\ message='test',\ send=send ) def post(self): session['send'] = request.form['send'] return redirect('/af/') app.add_url_rule('/af/', view_func=testget.as_view('af')) if __name__ == '__main__': app.debug=True app.run()
以上、同一メソッドでGET/POSTを定義する方法でした。
コメント