Odpowiedzi:
Spróbuj tak:
from flask import Response
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
return Response(xml, mimetype='text/xml')
Rzeczywisty typ zawartości jest oparty na parametrze mimetype i zestawie znaków (domyślnie UTF-8).
Obiekty odpowiedzi (i żądania) są udokumentowane tutaj: http://werkzeug.pocoo.org/docs/wrappers/
flask.Response
, nadpisać default_mimetype
atrybut class i ustaw, które jako app.response_class
werkzeug.pocoo.org/docs/wrappers/... flask.pocoo.org/docs/api/#flask.Flask.response_class
app.response_class
tak, jak wskazuje Simon, pamiętaj, aby użyć app.make_response
instancji odpowiedzi, jak wskazano w odpowiedzi poniżej .
Tak proste
x = "some data you want to return"
return x, 200, {'Content-Type': 'text/css; charset=utf-8'}
Mam nadzieję, że to pomoże
Aktualizacja: użyj tej metody, ponieważ będzie działać zarówno z pythonem 2.x, jak i pythonem 3.x
a po drugie eliminuje również problem z wieloma nagłówkami.
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
Podoba mi się odpowiedź @Simon Sapin. Skończyło się jednak na nieco innej takcie i stworzyłem własnego dekoratora:
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
i użyj go w ten sposób:
@app.route('/ajax_ddl')
@returns_xml
def ajax_ddl():
xml = 'foo'
return xml
Myślę, że jest to nieco wygodniejsze.
return 'msg', 200
, spowoduje to ValueError: Expected bytes
. Zamiast tego zmień dekorator na return Response(*r, content_type='whatever')
. Rozpakuje krotkę do argumentów. Dziękuję jednak za eleganckie rozwiązanie!
Użyj metody make_response, aby uzyskać odpowiedź ze swoimi danymi. Następnie ustaw atrybut MIME . Na koniec zwróć tę odpowiedź:
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
resp = app.make_response(xml)
resp.mimetype = "text/xml"
return resp
Jeśli używasz Response
bezpośrednio, tracisz szansę na dostosowanie odpowiedzi przez ustawienie app.response_class
. make_response
Metoda wykorzystuje app.responses_class
, aby obiekt odpowiedzi. W tym możesz stworzyć własną klasę, dodać, aby aplikacja używała jej globalnie:
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
make_response
jest lepsze niż używanieResponse
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
Zwykle nie musisz samodzielnie tworzyć Response
obiektu, ponieważmake_response()
zajmie się tym za Ciebie.
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
Jeszcze jedno, wydaje się, że nikt nie wspomniał o after_this_request
, chcę coś powiedzieć:
Wykonuje funkcję po tym żądaniu. Jest to przydatne do modyfikowania obiektów odpowiedzi. Funkcja otrzymuje obiekt odpowiedzi i musi zwrócić ten sam lub nowy.
więc możemy to zrobić after_this_request
, kod powinien wyglądać tak:
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>'
Możesz wypróbować następującą metodę (python3.6.2) :
przypadek pierwszy :
@app.route('/hello')
def hello():
headers={ 'content-type':'text/plain' ,'location':'http://www.stackoverflow'}
response = make_response('<h1>hello world</h1>',301)
response.headers = headers
return response
przypadek drugi :
@app.route('/hello')
def hello():
headers={ 'content-type':'text/plain' ,'location':'http://www.stackoverflow.com'}
return '<h1>hello world</h1>',301,headers
Używam Flaska. Jeśli chcesz zwrócić json, możesz napisać to:
import json #
@app.route('/search/<keyword>')
def search(keyword):
result = Book.search_by_keyword(keyword)
return json.dumps(result),200,{'content-type':'application/json'}
from flask import jsonify
@app.route('/search/<keyword>')
def search(keyword):
result = Book.search_by_keyword(keyword)
return jsonify(result)