web-dev-qa-db-ja.com

Flask POSTの例

特定のタグのテキストを特定のxpath(?key =)で置き換えるためにxmlファイルにアクセスする次のルートを想定します。

@app.route('/resource', methods = ['POST'])
def update_text():
    # CODE

次に、次のようにcURLを使用します。

curl -X POST http://ip:5000/resource?key=listOfUsers/user1 -d "John"

XpathエクスプレッションlistOfUsers/user1タグにアクセスする必要があります<user1>現在のテキストを「John」に変更します。

Flask and RESTそしてこの特定の良い例が見つからないので、これを達成する方法がわからないまた、lxmlを使用してxmlファイルを操作したいのは、すでに知っているからです。

誰かが私を導くための例を助けてくれますか?

34
bulkmoustache

実際に質問に答える前に:

URLのパラメーター(例:key=listOfUsers/user1)はGETパラメータであり、POSTリクエストに使用しないでください。 GETとPOSTの違いの簡単な説明は here にあります。

あなたの場合、REST原則を利用するには、おそらく次のものが必要です。

http://ip:5000/users
http://ip:5000/users/<user_id>

次に、各URLで、異なるHTTPメソッド(GETPOSTPUTDELETE)の動作を定義できます。たとえば、/users/<user_id>、次のものが必要です。

GET /users/<user_id> - return the information for <user_id>
POST /users/<user_id> - modify/update the information for <user_id> by providing the data
PUT - I will omit this for now as it is similar enough to `POST` at this level of depth
DELETE /users/<user_id> - delete user with ID <user_id> 

したがって、あなたの例では、POST/users/user_1にPOSTデータが"John"。次に、XPath式または他の方法でデータにアクセスする方法をユーザーから隠し、URLに厳密に結合しないようにします。このように、すべてのURLを変更するのではなく、データの保存方法とデータへのアクセス方法を変更する場合、サーバー側でコードを変更するだけです。

今、あなたの質問への答え:以下は、私が上で述べたことを達成する方法の基本的な準擬似コードです:

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/users/<user_id>', methods = ['GET', 'POST', 'DELETE'])
def user(user_id):
    if request.method == 'GET':
        """return the information for <user_id>"""
        .
        .
        .
    if request.method == 'POST':
        """modify/update the information for <user_id>"""
        # you can use <user_id>, which is a str but could
        # changed to be int or whatever you want, along
        # with your lxml knowledge to make the required
        # changes
        data = request.form # a multidict containing POST data
        .
        .
        .
    if request.method == 'DELETE':
        """delete user with ID <user_id>"""
        .
        .
        .
    else:
        # POST Error 405 Method Not Allowed
        .
        .
        .

POSTリクエストコンテンツタイプのように考慮すべき点は他にもたくさんありますが、これまで述べてきたことは合理的な出発点になるはずです。私はあなたが尋ねていた正確な質問に直接答えていないことを知っていますが、これがあなたの助けになることを願っています。後でいくつかの編集/追加も行います。

ありがとう、これがお役に立てば幸いです。何かおかしくなったら教えてください。

52
s16h

以下に、Post、GETメソッドを使用する方法を簡単に見つけ、同じ方法を使用して他のカード操作も追加できる例を示します。

#libraries to include

import os
from flask import request, jsonify
from app import app, mongo
import logger
ROOT_PATH = os.environ.get('ROOT_PATH')<br>
@app.route('/get/questions/', methods=['GET', 'POST','DELETE', 'PATCH'])
    def question():
    # request.args is to get urls arguments 


    if request.method == 'GET':
        start = request.args.get('start', default=0, type=int)
        limit_url = request.args.get('limit', default=20, type=int)
        questions = mongo.db.questions.find().limit(limit_url).skip(start);
        data = [doc for doc in questions]
        return jsonify(isError= False,
                    message= "Success",
                    statusCode= 200,
                    data= data), 200

# request.form to get form parameter

    if request.method == 'POST':
        average_time = request.form.get('average_time')
        choices = request.form.get('choices')
        created_by = request.form.get('created_by')
        difficulty_level = request.form.get('difficulty_level')
        question = request.form.get('question')
        topics = request.form.get('topics')

    ##Do something like insert in DB or Render somewhere etc. it's up to you....... :)
0
Shahzaib Ali