変更するのはapp.pyのみです。
前章でSQLAlchemyを使ってデータを取得できるようになったので、今回はデータの追加、更新をできるようにします。 そのためにdb_sessionが必要なのでflaski.databaseモジュールをimportします。またリクエストの最後に、セッションの後片付けをする必要があるのでshutdown_sessionメソッドを追加します。
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)
# 続く
POST時にformにアクセスするのでflaskからrequestをインポートしています(1行目)。更新時間を書き換えたいのでdatetimeモジュールもインポートしています。
前回GETでアクセスした場合にデータを取得するようにしましたが、同じURLにPOSTでアクセスした場合には新規追加または更新を行いたいのでapp.routeのメソッドを限定します。 これはmethodsというオプションに利用したいメソッドを明示的に指定すればよいです。下のコードはGETのアクセスに限定しています。
@app.route("/<title>", methods=["GET"])
続いてPOST用のコードが続きます。titleでデータを検索して存在しない場合に は追加、存在する場合は更新処理をしています。bodyはformで渡されることを 想定しています。今度はmethodsでPOSTメソッドのみに限定しています。
# 続き
@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()
これでサーバー側は新規追加や更新にも対応しました。
Note
methodsはGET,POST,PUT,DELETEといったRESTfullなサービスを構築するためのメソッドも使えます。
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"