[Python Flask] GET/POSTを同一メソッドで処理する方法

Flask
スポンサーリンク

こんにちは。

今回の記事では、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を定義する方法でした。

コメント

タイトルとURLをコピーしました