Пример фляжки с POST

Предположим, что следующий маршрут, который обращается к XML файлу, заменяет текст конкретного тега заданным xpath (? Key =):

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

Тогда я бы использовал cURL следующим образом:

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

Список xpath expreesion listOfUsers/user1 должен получить доступ к тегу <user1> чтобы изменить его текущий текст на "John".

Я понятия не имею, как добиться этого, потому что я только начинаю изучать Flask и REST, и я не могу найти хороший пример для этого конкретного случая. Кроме того, я хотел бы использовать lxml для управления файлом xml, поскольку я уже знаю его.

Может ли кто-нибудь помочь и привести пример, чтобы вести меня?

Ответ 1

Прежде чем ответить на ваш вопрос:

Параметры в URL (например, key=listOfUsers/user1) являются параметрами GET и вы не должны использовать их для запросов POST. Краткое объяснение разницы между GET и POST можно найти здесь.

В вашем случае, чтобы использовать принципы REST, вы, вероятно, должны иметь:

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

Затем на каждом URL вы можете определить поведение различных методов HTTP (GET, POST, PUT, DELETE). Например, в /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 но я думаю, что то, что я сказал до сих пор, должно быть разумной отправной точкой. Я знаю, что не ответил прямо на вопрос, который вы задавали, но я надеюсь, что это поможет вам. Я сделаю некоторые изменения/дополнения позже, а также.

Спасибо, и я надеюсь, что это полезно. Пожалуйста, дайте мне знать, если я что-то не так понял.

Ответ 2

Вот пример, в котором вы можете легко найти способ использовать 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'])<br>
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.g'enter code here'et('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 up to you....... :)

Ответ 3

Просто введите двойную кавычку в URL-адрес, например:

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