Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask example with POST

Suppose the following route which accesses an xml file to replace the text of a specific tag with a given xpath (?key=):

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

Then, I would use cURL like this:

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

The xpath expreesion listOfUsers/user1 should access the tag <user1> to change its current text to "John".

I have no idea on how to achieve this because I'm just starting to learn Flask and REST and I can't find any good example for this specific case. Also, I'd like to use lxml to manipulate the xml file since I already know it.

Could somebody help and provide an example to guide me?

like image 319
bulkmoustache Avatar asked Apr 08 '14 20:04

bulkmoustache


People also ask

How do you use POST method in Flask?

In order to demonstrate the use of POST method in URL routing, first let us create an HTML form and use the POST method to send form data to a URL. Now enter the following script in Python shell. After the development server starts running, open login. html in the browser, enter name in the text field and click Submit.

What is post and get in Flask?

A GET message is send, and the server returns data. POST. Used to send HTML form data to the server. The data received by the POST method is not cached by the server.


2 Answers

Before actually answering your question:

Parameters in a URL (e.g. key=listOfUsers/user1) are GET parameters and you shouldn't be using them for POST requests. A quick explanation of the difference between GET and POST can be found here.

In your case, to make use of REST principles, you should probably have:

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

Then, on each URL, you can define the behaviour of different HTTP methods (GET, POST, PUT, DELETE). For example, on /users/<user_id>, you want the following:

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>  

So, in your example, you want do a POST to /users/user_1 with the POST data being "John". Then the XPath expression or whatever other way you want to access your data should be hidden from the user and not tightly couple to the URL. This way, if you decide to change the way you store and access data, instead of all your URL's changing, you will simply have to change the code on the server-side.

Now, the answer to your question: Below is a basic semi-pseudocode of how you can achieve what I mentioned above:

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

There are a lot of other things to consider like the POST request content-type but I think what I've said so far should be a reasonable starting point. I know I haven't directly answered the exact question you were asking but I hope this helps you. I will make some edits/additions later as well.

Thanks and I hope this is helpful. Please do let me know if I have gotten something wrong.

like image 115
s16h Avatar answered Oct 02 '22 05:10

s16h


Here is the example in which you can easily find the way to use Post,GET method and use the same way to add other curd operations as well..

#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....... :) 
like image 31
Shahzaib Ali Avatar answered Oct 02 '22 03:10

Shahzaib Ali