03 03 2013 Python Flask SQLAlchemy Tweet
POSTメソッドでデータを変更できるようにする
今回変更するのはapp.pyのみです。
SQLAlchemyを使ってデータを取得できるようになったので、データの追加、更新をできるようにします。そのためにはpython対話環境で行ったようにdb_sessionが必要なのでflaski.databaseモジュールをimportします。またリクエストの最後に、セッションの後片付けをする必要があります(shutdown_session)。
POST時にformにアクセスするのでflaskからrequestをインポートしています(1行目)。さらに、更新時を書き換えたいのでdatetimeモジュールもインポートしています。
from flask import Flask, render_template, abort, request from flaski.models import WikiContent from flaski.database import db_session from datetime import datetime app = Flask(__name__) app.config['DEBUG'] = True @app.teardown_request def shutdown_session(exception=None): db_session.remove() @app.route("/") def hello(): contents = WikiContent.query.all() return render_template("index.html", contents=contents) @app.route("/<title>", methods=["GET"]) def show_content(title): content = WikiContent.query.filter_by(title=title).first() if content is None: abort(404) return render_template("show_content.html", content=content) # 続く
GETでアクセスした場合にデータを取得、POSTでアクセスすると新規追加または更新を行いたいのでapp.routeのメソッドを限定します。
@app.route("/<title>", methods=["GET"])
POST用のコードが続きます。titleでデータを検索して存在しない場合には追加、存在する場合は更新処理をしています。bodyはformで渡されることを想定しています。
# 続き @app.route("/<title>", methods=["POST"]) def post_content(title=None): if title is None: abort(404) content = WikiContent.query.filter_by(title=title).first() if content is None: content = WikiContent(title, request.form["body"] ) else: content.body = request.form["body"] content.date = datetime.now() db_session.add(content) db_session.commit() return content.body if __name__ == "__main__": app.run()
HTTP経由でデータの追加更新をテストする
HTMLでフォームを用意するのは面倒なので、今回はhttpieを利用してコマンドラインから操作してみます。
pipでインストールします
pip install httpie # $HOME/.virtualenvs/flaski/binにインストールされます
新規データを登録します。app.pyを実行してサーバーを起動しておくのを忘れないでください。
$ http --form POST http://localhost:5000/httpie body="test from httpie" HTTP/1.0 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 16 Server: Werkzeug/0.8.3 Python/2.7.3 Date: Sun, 03 Mar 2013 04:09:36 GMT test from httpie
--formオプション(または-f)をつけるとformで送られます。データが新規に追加されていることをブラウザで確認します。
データが既に存在する場合には更新されることも確認します。
$ http --form POST http://localhost:5000/httpie body="modified from httpie"
まとめ
FlaskiにPOST経由でのデータ追加、更新を実装しました。
ここまでのGitHub