it-swarm.com.de

Flaschenbeispiel mit POST

Angenommen, die folgende Route greift auf eine XML-Datei zu, um den Text eines bestimmten Tags durch einen angegebenen X-Pfad (? Key =) zu ersetzen:

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

Dann würde ich cURL so verwenden:

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

Der Xpath-Expreß listOfUsers/user1 sollte auf das Tag <user1> zugreifen, um seinen aktuellen Text in "John" zu ändern.

Ich habe keine Ahnung, wie ich das erreichen kann, weil ich gerade anfange, Flask und REST zu lernen, und ich kann kein gutes Beispiel für diesen speziellen Fall finden. Außerdem möchte ich lxml verwenden, um die XML-Datei zu bearbeiten, da ich sie bereits kenne. 

Könnte jemand helfen und mir ein Beispiel geben?

26
bulkmoustache

Bevor Sie Ihre Frage tatsächlich beantworten:

Parameter in einer URL (z. B. key=listOfUsers/user1) sind GET-Parameter und sollten nicht für POST-Anforderungen verwendet werden. Eine kurze Erklärung für den Unterschied zwischen GET und POST finden Sie hier .

In Ihrem Fall sollten Sie, um die REST -Prinzipien anzuwenden, wahrscheinlich Folgendes haben:

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

Anschließend können Sie für jede URL das Verhalten verschiedener HTTP-Methoden definieren (GET, POST, PUT, DELETE). Auf /users/<user_id> möchten Sie beispielsweise Folgendes:

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> 

In Ihrem Beispiel möchten Sie also eine POST in /users/user_1 ausführen, wobei die POST - Daten "John" sind. Dann sollte der XPath-Ausdruck oder die andere Weise, auf die Sie auf Ihre Daten zugreifen möchten, für den Benutzer ausgeblendet werden und darf nicht fest mit der URL gekoppelt sein. Auf diese Weise müssen Sie, wenn Sie sich entscheiden, die Art und Weise, wie Sie Daten speichern und abrufen, ändern, anstatt alle URLs zu ändern, lediglich den Code auf der Serverseite ändern.

Nun, die Antwort auf Ihre Frage: Nachfolgend finden Sie einen grundlegenden Halbpseudocode, wie Sie das erreichen können, was ich oben erwähnt habe:

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

Es gibt viele andere Dinge, die zu berücksichtigen sind, wie der Inhaltstyp POST, aber ich denke, das, was ich bisher gesagt habe, sollte ein vernünftiger Ausgangspunkt sein. Ich weiß, ich habe die Frage nicht direkt beantwortet, aber Sie hoffen, das hilft Ihnen. Ich werde später auch einige Bearbeitungen/Ergänzungen vornehmen.

Danke und ich hoffe das ist hilfreich. Bitte lassen Sie mich wissen, wenn ich etwas falsch gemacht habe.

41
s16h

Hier ist das Beispiel, in dem Sie leicht den Weg finden können, die Post-, GET-Methode zu verwenden und auf dieselbe Weise auch andere Quarkoperationen hinzuzufügen.

#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