2014-04-08 10 views
13

Supponiamo che il seguente percorso che accede a un file XML per sostituire il testo di un tag specifico con un dato XPath (= chiave?):Flask esempio con POST

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

Poi, vorrei utilizzare cURL in questo modo:

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

XPath expreesion listOfUsers/user1 dovrebbe accedere al tag <user1> di cambiare la sua attuale testo per "John".

Non ho idea di come ottenere ciò perché sto appena iniziando a imparare Flask e REST e non riesco a trovare alcun buon esempio per questo caso specifico. Inoltre, mi piacerebbe usare lxml per manipolare il file xml poiché lo conosco già.

Qualcuno può aiutare e fornire un esempio per guidarmi?

risposta

21

Prima effettivamente rispondere alla tua domanda:

parametri in un URL (ad esempio key=listOfUsers/user1) sono GET parametri e non si dovrebbe essere li utilizzano per POST richieste. Una rapida spiegazione della differenza tra GET e POST può essere trovata here.

Nel tuo caso, di fare uso di principi REST, probabilmente si dovrebbe avere:

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

Poi, ogni URL, è possibile definire il comportamento di diversi metodi HTTP (GET, POST, PUT, DELETE). Ad esempio, su /users/<user_id>, si desidera che il seguente:

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> 

Quindi, nel tuo esempio, si vuole fare un POST-/users/user_1 con i dati POST essere "John". Quindi l'espressione XPath o qualsiasi altro modo in cui desideri accedere ai tuoi dati dovrebbe essere nascosta all'utente e non strettamente legata all'URL. In questo modo, se decidi di cambiare il modo di archiviare e accedere ai dati, invece di modificare tutti gli URL, dovrai semplicemente modificare il codice sul lato server.

Ora, la risposta alla tua domanda: Qui di seguito è un semi-pseudocodice di base di come si può ottenere quello che ho citato sopra:

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

Ci sono un sacco di altre cose da considerare come il POST richiesta tipo di contenuto, ma penso che quello che ho detto finora dovrebbe essere un punto di partenza ragionevole. So che non ho risposto direttamente alla domanda esatta che stavi chiedendo, ma spero che questo ti aiuti. Farò anche alcune modifiche/aggiunte successivamente.

Grazie e spero che questo sia utile. Per favore fatemi sapere se ho sbagliato qualcosa.

+0

devi fare qualcosa di speciale per il posto da ottenere instradato indietro correttamente?Ho/concorsi/ istituito, ma quando si verifica il POST, posta a/concorsi, quindi la logica di gestione post non viene mai raggiunta. –

-4

Basta mettere virgolette in URL, in questo modo:

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