web-dev-qa-db-fra.com

Exemple de flacon avec POST

Supposons la route suivante qui accède à un fichier XML pour remplacer le texte d'une balise spécifique par un xpath donné (? Key =):

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

Ensuite, j'utiliserais cURL comme ceci:

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

Xpath expreesion listOfUsers/user1 doit accéder à la balise <user1> pour changer son texte actuel en "John".

Je ne sais pas du tout comment y parvenir, car je commence tout juste à apprendre Flask et REST et je ne trouve aucun bon exemple pour ce cas particulier. De plus, j'aimerais utiliser lxml pour manipuler le fichier xml puisque je le connais déjà. 

Quelqu'un pourrait-il aider et donner un exemple pour me guider?

26
bulkmoustache

Avant de répondre à votre question:

Les paramètres dans une URL (par exemple, key=listOfUsers/user1) sont des paramètres GET et vous ne devriez pas les utiliser pour les demandes POST. Une explication rapide de la différence entre GET et POST peut être trouvée ici .

Dans votre cas, pour utiliser les principes REST, vous devriez probablement avoir:

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

Ensuite, sur chaque URL, vous pouvez définir le comportement de différentes méthodes HTTP (GET, POST, PUT, DELETE). Par exemple, sur /users/<user_id>, vous voulez ce qui suit:

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> 

Ainsi, dans votre exemple, vous souhaitez créer une variable POST en /users/user_1 avec les données POST étant "John". Ensuite, l'expression XPath ou tout autre moyen par lequel vous souhaitez accéder à vos données doit être masqué à l'utilisateur et ne pas être étroitement couplé à l'URL. Ainsi, si vous décidez de modifier la manière dont vous stockez et accédez aux données, au lieu de modifier toutes vos URL, vous devrez simplement changer le code côté serveur.

Maintenant, la réponse à votre question: Vous trouverez ci-dessous un semi-pseudocode de base sur la manière dont vous pouvez réaliser ce que j'ai mentionné ci-dessus:

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
        .
        .
        .

Il y a beaucoup d'autres choses à considérer comme le type de contenu de la requête POST mais je pense que ce que j'ai dit jusqu'à présent devrait être un point de départ raisonnable. Je sais que je n'ai pas directement répondu à la question exacte que vous posiez, mais j'espère que cela vous aidera. Je ferai aussi quelques modifications/ajouts plus tard.

Merci et j'espère que c'est utile. S'il vous plaît, faites-moi savoir si je me suis trompé.

41
s16h

Voici l'exemple dans lequel vous pouvez facilement trouver le moyen d'utiliser la méthode Post, GET et utiliser le même moyen pour ajouter d'autres opérations de caillé.

#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