Ich verwende Flask und gebe eine XML-Datei aus einer Get-Anfrage zurück. Wie stelle ich den Inhaltstyp ein?
z.B.
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
header("Content-type: text/xml")
return xml
Versuchen Sie es so:
from flask import Response
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
return Response(xml, mimetype='text/xml')
Der tatsächliche Inhaltstyp basiert auf dem Parameter mimetype und dem Zeichensatz (Standardeinstellung ist UTF-8).
Antwort- (und Anfrage-) Objekte sind hier dokumentiert: http://werkzeug.pocoo.org/docs/wrappers/
So einfach ist das
x = "some data you want to return"
return x, 200, {'Content-Type': 'text/css; charset=utf-8'}
Ich hoffe es hilft
Update: Verwenden Sie diese Methode, da sie sowohl mit Python 2.x als auch mit Python 3.x funktioniert
und zweitens beseitigt es auch das Problem mit mehreren Headern.
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
Ich mag die Antwort von @Simon Sapin. Am Ende nahm ich jedoch einen etwas anderen Ansatz und kreierte meinen eigenen Dekorateur:
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
und benutze es so:
@app.route('/ajax_ddl')
@returns_xml
def ajax_ddl():
xml = 'foo'
return xml
Ich finde das etwas angenehmer.
Verwenden Sie die Methode make_response , um eine Antwort mit Ihren Daten zu erhalten. Setzen Sie dann das Attribut mimetype . Geben Sie schließlich diese Antwort zurück:
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
resp = app.make_response(xml)
resp.mimetype = "text/xml"
return resp
Wenn Sie Response
direkt verwenden, können Sie die Antworten nicht anpassen, indem Sie app.response_class
einstellen. Die make_response
-Methode verwendet den app.responses_class
, um das Antwortobjekt zu erstellen. Hier können Sie Ihre eigene Klasse erstellen und hinzufügen, damit Ihre Anwendung sie global verwendet:
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
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
Normalerweise müssen Sie das Response
object nicht selbst erstellen, weil make_response()
das für Sie erledigt.
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
Noch etwas, es scheint, dass niemand den after_this_request
erwähnte, ich möchte etwas sagen:
Führt nach dieser Anforderung eine Funktion aus. Dies ist nützlich, um Antwortobjekte zu ändern. Die Funktion wird an das Antwortobjekt übergeben und muss dasselbe oder ein neues zurückgeben.
damit wir es mit after_this_request
machen können, sollte der Code so aussehen:
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>'
Sie können die folgende Methode (python3.6.2) ausprobieren:
fall eins:
@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
fall zwei:
@app.route('/hello')
def hello():
headers={ 'content-type':'text/plain' ,'location':'http://www.stackoverflow.com'}
return '<h1>hello world</h1>',301,headers
Ich benutze Flask. Und wenn Sie Json zurückgeben möchten, können Sie Folgendes schreiben:
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)