============================================ POSTメソッドでデータを変更できるようにする ============================================ 変更するのはapp.pyのみです。 前章でSQLAlchemyを使ってデータを取得できるようになったので、今回はデータの追加、更新をできるようにします。 そのためにdb_sessionが必要なのでflaski.databaseモジュールをimportします。またリクエストの最後に、セッションの後片付けをする必要があるのでshutdown_sessionメソッドを追加します。 コードの説明 ============ .. code-block:: python 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("/", 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のアクセスに限定しています。 .. code-block:: python @app.route("/<title>", methods=["GET"]) 続いてPOST用のコードが続きます。titleでデータを検索して存在しない場合に は追加、存在する場合は更新処理をしています。bodyはformで渡されることを 想定しています。今度はmethodsでPOSTメソッドのみに限定しています。 .. code-block:: python # 続き @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なサービスを構築するためのメソッドも使えます。 HTTP経由でデータの追加や更新をテストする ======================================== HTMLでフォームを用意するのは面倒なので、`httpie <https://pypi.python.org/pypi/httpie/>`_ を利用してコマンドラインから操作してみます。 pipでインストールします .. code-block:: python pip install httpie # $HOME/.virtualenvs/flaski/binにインストールされます 新規データを登録します。app.pyを実行してサーバーを起動しておくのを忘れないでください。 .. code-block:: sh $ 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で送られます。データが新規に追加されていることをブラウザで確認します。 データが既に存在する場合には更新されることも確認します。 .. code-block:: sh $ http --form POST http://localhost:5000/httpie body="modified from httpie" ここまでのGitHub ================ - `POSTメソッドでデータを変更 <https://github.com/kzfm/flaski/commit/898adb0827b90d8bc1f9cd0fd01e53f3a52b45a8>`_