2012-08-02 38 views

Respuesta

153

Trate de esta manera:

from flask import Response 
@app.route('/ajax_ddl') 
def ajax_ddl(): 
    xml = 'foo' 
    return Response(xml, mimetype='text/xml') 

El actual tipo de contenido se basa en el parámetro tipo MIME y el juego de caracteres (por defecto UTF-8).

de respuesta (y solicitar) objetos se documentan aquí: http://werkzeug.pocoo.org/docs/wrappers/

+0

¿Es posible establecer estas y otras opciones a nivel global (es decir: por defecto)? – earthmeLon

+5

@earthmeLon, crea una subclase de 'flask.Response', anula el atributo de clase' default_mimetype' y configúralo como 'app.response_class' http://werkzeug.pocoo.org/docs/wrappers/#werkzeug.wrappers .BaseResponse.default_mimetype http://flask.pocoo.org/docs/api/#flask.Flask.response_class –

+0

@earthmeLon: Si configura 'app.response_class' como Simon señala, recuerde usar' app.make_response' para obtener su instancia de respuesta como [señalado en la respuesta a continuación] (http://stackoverflow.com/a/31751634/110204). –

31

me gusta y upvoted respuesta de @Simon Sapin. Acabé teniendo una perspectiva un poco diferente, sin embargo, y creé mi propio decorador:

from flask import Response 
from functools import wraps 

def returns_xml(f): 
    @wraps(f) 
    def decorated_function(*args, **kwargs): 
     r = f(*args, **kwargs) 
     return Response(r, content_type='text/xml; charset=utf-8') 
    return decorated_function 

y lo uso así:

@app.route('/ajax_ddl') 
@returns_xml 
def ajax_ddl(): 
    xml = 'foo' 
    return xml 

Creo que esto es un poco más cómodo.

91

Tan simple como esto

x = "some data you want to return" 
return x, 200, {'Content-Type': 'text/css; charset=utf-8'} 

creo que sirve

Actualización: Utilice este método, ya que funcionará tanto con Python 2.x y 3.x pitón

y en segundo lugar también elimina el problema de múltiples encabezados.

from flask import Response 
r = Response(response="TEST OK", status=200, mimetype="application/xml") 
r.headers["Content-Type"] = "text/xml; charset=utf-8" 
return r 
+11

La solución más simple. Definitivamente debería ser la respuesta aceptada –

+2

Solo esto funciona para Python 3. – akai

+0

Existe un inconveniente: solo le permite agregar encabezados. Cuando lo hice, terminé con dos encabezados Content-Type en respuesta, uno predeterminado y uno agregado. – omikron

5
from flask import Flask, render_template, make_response 
app = Flask(__name__) 

@app.route('/user/xml') 
def user_xml(): 
    resp = make_response(render_template('xml/user.html', username='Ryan')) 
    resp.headers['Content-type'] = 'text/xml; charset=utf-8' 
    return resp 
+0

Creo que esta respuesta es importante porque deja en claro cómo cambiar los encabezados en algo de un render_template. –

17

Uso del make_response method para obtener una respuesta con sus datos. Luego configure el mimetype attribute. Finalmente devolver esta respuesta:

@app.route('/ajax_ddl') 
def ajax_ddl(): 
    xml = 'foo' 
    resp = app.make_response(xml) 
    resp.mimetype = "text/xml" 
    return resp 

Si utiliza Response directamente, se pierde la oportunidad de personalizar las respuestas mediante el establecimiento de app.response_class. El método make_response usa app.responses_class para crear el objeto de respuesta. En esto puede crear su propia clase, agrega que su aplicación sea lo utiliza en todo el mundo:

class MyResponse(app.response_class): 
    def __init__(self, *args, **kwargs): 
     super(MyResponse, self).__init__(*args, **kwargs) 
     self.set_cookie("last-visit", time.ctime()) 

app.response_class = MyResponse 
+0

Esto es esencialmente la respuesta aceptada de @ SimonSapin reempaquetada. – J0e3gan

+0

@ J0e3gan gracias. He ampliado mi respuesta para explicar mejor por qué usar 'make_response' es mejor que usar' Response' –

1

Por lo general, no tienen que crear el objeto Response mismo porque make_response() se hará cargo de eso por ti.

from flask import Flask, make_response          
app = Flask(__name__)              

@app.route('/')                
def index():                 
    bar = '<body>foo</body>'             
    response = make_response(bar)           
    response.headers['Content-Type'] = 'text/xml; charset=utf-8'    
    return response 

Una cosa más, parece que nadie mencionó la after_this_request, quiero decir algo:

after_this_request

Ejecuta una función después de esta solicitud. Esto es útil para modificar objetos de respuesta. La función pasa el objeto de respuesta y tiene que devolver la misma o una nueva.

para que podamos hacerlo con after_this_request, el código debería tener este aspecto:

from flask import Flask, after_this_request 
app = Flask(__name__) 

@app.route('/') 
def index(): 
    @after_this_request 
    def add_header(response): 
     response.headers['Content-Type'] = 'text/xml; charset=utf-8' 
     return response 
    return '<body>foobar</body>' 
Cuestiones relacionadas