wake-up-neo.com

Python Flask, wie man den Inhaltstyp setzt

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
142
Tampa

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/

196
Simon Sapin

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
117
Harsh Daftary

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.

37
Michael Wolf

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  
20
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
11
Ryan Liu

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:

after_this_request

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>'
5
lord63. j

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)
0
zhengGuo