This article was originally posted on realpythonproject.com
I’ll be using Repl.it for writing all the code. Repl.it lets you quickly deploy your API and is really convenient. You can find my Repl here
Here are the 4 types of data we will be looking at
- Sending/Receiving Parameters
- Sending/Receiving Form Data
- Sending/Receiving JSON String Data
- Sending/Receiving Files
Why would you want to learn how to Receive/Send Data in Flask?
In a lot of cases when you are developing a Flask API that interacts with 3p services such as other APIs, Webhooks, Serverless Functions, etc, you won’t have control over what kind of data you receive. However, knowing how to receive different kinds of data in Flask will help you handle the data appropriately. If the 3p service’s source code is in Python, you can go over this article to find the relevant section. Being able to send different formats of data is also helpful since it’ll allow you to write unit tests for your API.
Project Setup
Install Flask using the following command
pip3 install flask
Below is a simple Flask API
from flask import Flask,request
app = Flask('app')
@app.route('/')
def hello_world():
return 'Hello, World!'
app.run(host='0.0.0.0', port=8080)
The endpoint simply returns a string.
Parameters
How to Access Parameters from a Request in Flask
Below is a code snippet that can access the parameters that were sent.
@app.route('/receiveParameters')
def receiveParameters():
data = request.args
return {'data': data}, 200
You can use the request.args
to access the parameters. It returns the parameters as a dictionary.
How to Make a Request with Parameters Using Python
Below is the code snippet which makes a request to a URL and sends a couple of parameters.
import requests
url = 'https://FlaskReceive.rahulbanerjee26.repl.co'
response = requests.get(url+'/receiveParameters?name=Rahul&age=22')
print(response.json())
response = requests.get(url+'/receiveParameters',
params = {
'name': 'Rahul',
'age': 22
}
)
print(response.json())
'''
OUTPUT
{'data': {'age': '22', 'name': 'Rahul'}}
{'data': {'age': '22', 'name': 'Rahul'}}
'''
There are two ways you can pass parameters, the first is to directly add it to the URL and the second is to add it in a JSON object.
Form Data
How to Receive Form Data in Flask
Flask has a property called request.form
that lets it access form data. Below is an endpoint to receive form data
@app.route('/receiveFormData',methods=['POST'])
def receiveFormData():
name = request.form['name']
age = request.form['age']
print(name)
print(age)
return{
'data': {
'name': name,
'age': age
}
},200
It will accept POST
requests and simply return the data.
We will look at two ways to send form data to the above endpoint. In the first way, we will create a simple form in HTML, and in the second way, we will send the form data using Python
How to send For Data using HTML to our Flask API Endpoint
I created a new repl for this. You can find it over here. Below is the HTML form.
<!DOCTYPE html>
<html>
<body>
<h2>HTML Forms</h2>
<form action="https://FlaskReceive.rahulbanerjee26.repl.co/receiveFormData" method='post'>
<label for="name">First name:</label><br>
<input type="text" name='name'><br>
<label for="age">Last name:</label><br>
<input type="text" name='age'><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
For the action
attribute, I set the value to the Flask Endpoint we created in the above section. We also set method
to POST
since the endpoint only accepts Post Requests.
This will create a form with two inputs and submit button. Whenever the user clicks on the submit button, the form will make a Post request to the receiveFormData
endpoint.
How to Send Form Data using Python
This could be useful when you are writing unit tests to test your Flask API.
Below is a code snippet to test request.form
data = {
'name': 'Rahul',
'age': 22
}
print("Request to /receiveFormData")
formResponse = requests.post(
url+'/receiveFormData',
data=data,
headers= {
'Content-Type': 'application/x-www-form-urlencoded'
})
print(formResponse.json())
The Content-Type
is set to application/x-www-form-urlencoded
JSON StringData
JSON is something that is common to most programming languages so this might be the most common case.
How to Receive JSON String Data in Flask
from flask import jsonify
@app.route('/receiveJson',methods=['POST'])
def receivePostData():
data = jsonify(request.json)
print(data)
return data,200
We can use request.json
to retrieve the data. To convert the json string object to JSON , we will use a Flask method called jsonify
. This will let you access keys similar to how you would do with a dictionary.
How to Send JSON String Data using Python
import json
print("Request to /receiveJson")
jsonData={
'name': 'Rahul',
'age': 22
}
jsonResponse = requests.post(
url+'/receiveJson',
json=json.dumps(jsonData)
)
print(jsonResponse.json())
We will use json.dumps
to convert the dictionary to a JSON String before attaching it as a payload to the POST request.
You can directly send the dictionary without converting it into a JSON string as well. In this case, you wouldn’t need to use jsonify
it before returning the response.
Files
I have created a simple text file. We will attach the text file as a payload to the API endpoint. The API will read the contents of the file and return the content.
How to Receive Files in Flask
@app.route('/receiveFile',methods=['POST'])
def receiveFile():
file= request.files['textFile']
data = file.read().decode('utf-8')
print(data)
return {
"data": data
},200
request.files
returns an FileStorage
object, as a result, you can directly use read
to get the content of the file. We will need to decode it before sending it as response data.
Working with files can get somewhat confusing, specifically the following line
data = file.read().decode('utf-8')
Depending on the format of the file, you might not have to decode it. Instead, you might have to use something like json.loads(byteData)
to convert a byte object to JSON.
How to Send Files Using Python
print("Request to /receiveFile ")
with open('testFile.txt','r') as f:
fileResponse = requests.post(
url+'/receiveFile',
files={
'textFile': f
}
)
print(fileResponse.json())
Depending on if you open it using mode r
or rb
, the code you wrote to create the endpoint will change.
Conclusion
In this article, we created 4 endpoints for our API. Each endpoint expected a different format of data. I hope you found this article useful. If you liked this article, you might like another article that helps you get comfortable working with APIs