Flaskにてrequest.methodでPUTの判定をできるようにする

ハマったのでメモ。

PUTメソッドを使うにはサーバーサイドの方で、

from werkzeug.wrappers import Request
from werkzeug.wsgi import get_input_stream
from werkzeug.formparser import parse_form_data
from io import BytesIO

class MethodRewriteMiddleware(object):
    def __init__(self, app, input_name='_method'):
        self.app = app
    def __call__(self, environ, start_response):
        if environ["REQUEST_METHOD"].upper() == "POST":
            environ["wsgi.input"] = stream = \
                BytesIO(get_input_stream(environ).read())
            formdata = parse_form_data(environ)[1]
            stream.seek(0)
            method = formdata.get("_method","").upper()
            if method in ("GET","POST","PUT","DELETE"):
                environ["REQUEST_METHOD"] = method
        return self.app(environ,start_response)
....

app = Flask(__name__)
app.config.from_object(config)
app.wsgi_app = MethodRewriteMiddleware(app.wsgi_app)

みたいにしてView側では

    <form method="POST" action="/hoge">
    <input type="hidden" name="_method" value="PUT"/>
    <h1><input name="title" type="text" value="" size="100"></input></h1>
    </form>

のような感じで呼ぶとrequest.methodにPUTの値が入るようになる。

@app.route("/hoge")
def hoge():
    if request.method == "PUT":
        return "called put method."

これで綺麗にリクエスト処理を書けるようになった。Flaskは楽しい!

Related Contents

Pickup Contents