¿Cómo altero una respuesta en el matraz en la función after_request?

Soy nuevo en Flask y Python. Tengo un montón de vistas que devuelven un diccionario en formato jsonify (). Para cada una de estas vistas, me gustaría agregar un controlador after_request para alterar la respuesta para poder agregar una clave a ese diccionario. Yo tengo:

@app.route('/view1/') def view1(): .. return jsonify({'message':'You got served!'}) @app.after_request def after(response): d = json.loads(response.response) d['altered'] = 'this has been altered...GOOD!' response.response = jsonify(d) return response 

El error que recibo es “TypeError: los índices de lista deben ser enteros, no str”. ¿Cómo modifico el diccionario de respuestas y agrego una clave después de que se complete la solicitud?

response es un objeto WSGI, y eso significa que el cuerpo de la respuesta debe ser un iterable. Para las respuestas jsonify() eso es solo una lista con una sola cadena.

Sin embargo, debe usar el método response.get_data() aquí para recuperar el cuerpo de la respuesta, ya que eso aplanará la respuesta para usted.

Lo siguiente debería funcionar:

 d = json.loads(response.get_data()) d['altered'] = 'this has been altered...GOOD!' response.set_data(json.dumps(d)) 

No uses jsonify() nuevo aquí; que devuelve un nuevo objeto de respuesta completo; Todo lo que quieres es el cuerpo de respuesta JSON aquí.

Use response.set_data() ya que también ajustará el encabezado Content-Length para reflejar el tamaño de respuesta alterado.

Esto parece un poco viejo ya que la última respuesta fue escrita hace cuatro años.

Parece que hay una forma de obtener la respuesta sin analizar la cadena de datos de respuesta. Utilizar

 response.get_json() 

La respuesta devuelve un objeto dict, pero como Flask devuelve un error si está intentando actualizar una clave en un tipo que no sea dict. Use de la siguiente manera:

 data = response.get_json() if type(data) is dict: data['hi'] = 'hi' response.data = json.dumps(data) return response