Search code examples
pythonflaskunicodehttp-headersmime-types

How to correctly decode text content POST with Flask


What is the correct way to handle character encoding when processing a POST request containing "text/plain" data in Flask?

Test application:

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route("/put-text", method=['POST'])
def hello_world():
    print("data", request.data)
    return {}

Example request

import requests

url = 'http://127.0.0.1:5000/put-text'
data = 'The quick brown fox jumped over the lazy dog."
headers = {
    "Content-Type:":"text/plain",
}

res = requests.post(url, data=data, headers=headers)

With this, the request.data is bytes, and I could decode it relatively easily, but how do I make this code robust to support unicode or different text encodings?


Solution

  • According to the Flask docs, request.get_data(as_text=True) probably does what you want:

    @app.route("/put-text", method=['POST'])
    def hello_world():
        text = request.get_data(as_text=True)
        # do something with the `text`...
        return {}
    

    Presumably, Flask will decode the text with the correct encoding, as specified by the client in the respective header. Provided the client specifies the correct encoding, of course...