Flask报415 Unsupported Media Type 异常的原因以及解决办法

  • Post category:Python

Flask框架报 415 Unsupported Media Type 异常的原因大多是因为请求的Content-Type与服务器端期望的Content-Type不一致。服务器期望的Content-Type通过请求头中的Content-Type字段进行设置,而请求的Content-Type则由客户端发起请求发送数据时设置。

以下是一些可能引起该异常的原因:

1.客户端未设置Content-Type,或设置的Content-Type与服务器期望的不一致。

如下示例,客户端请求中未设置Content-Type,服务器期望的Content-Type为application/json:

import requests
import json

url = 'http://localhost:5000/api/books'
data = {"name": "Flask Web Development", "author": "Miguel Grinberg"}

response = requests.post(url=url, data=json.dumps(data))

这种情况下,可以给请求头中加入Content-Type字段,指定Content-Type为application/json:

headers = {"Content-Type": "application/json"}
response = requests.post(url=url, data=json.dumps(data), headers=headers)

2.客户端设置的Content-Type与服务器期望的Content-Type不匹配。

例如,在以下的情况下,客户端设置的Content-Type是application/x-www-form-urlencoded,但服务器期望的Content-Type为application/json:

import requests

url = 'http://localhost:5000/api/books'
data = {"name": "Flask Web Development", "author": "Miguel Grinberg"}

response = requests.post(url=url, data=data)

这种情况下,需要修改客户端设置的Content-Type为服务器端期望的Content-Type:

headers = {"Content-Type": "application/json"}
response = requests.post(url=url, json=data, headers=headers)

3.服务器端未正确解析请求数据。

在处理POST请求时,服务器会从请求中获取form表单数据(Content-Type为application/x-www-form-urlencoded)或者json格式的数据(Content-Type为application/json等)。如果服务器端未正确设置请求的Content-Type,或者未正确解析请求数据类型,则会出现该异常。

避免这种异常的发生,需要使用Flask框架提供的request对象对请求的Content-Type进行判断和处理,例如:


from flask import Flask, request

app = Flask(__name__)

@app.route('/api/books', methods=['POST'])
def add_book():
    if request.headers['Content-Type'] == 'application/json':
        data = request.get_json()  # 获取json数据
        # 处理json数据
    elif request.headers['Content-Type'] == 'application/x-www-form-urlencoded':
        data = request.form.to_dict()  # 获取表单数据
        # 处理表单数据

如上示例,通过判断请求头中设置的Content-Type,可以根据不同的ContentType对请求数据进行正确的解析和处理。

总之,在处理POST请求时,要确保客户端发起的请求数据类型与服务器端期望的处理数据类型一致,避免出现415 Unsupported Media Type异常。