Yanıtlar:
Şunu deneyin:
from flask import Response
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
return Response(xml, mimetype='text/xml')
Gerçek Content-Type, mimetype parametresini ve karakter kümesini temel alır (varsayılan değer UTF-8'dir).
Yanıt (ve istek) nesneleri burada belgelenmiştir: http://werkzeug.pocoo.org/docs/wrappers/
flask.Response
, default_mimetype
sınıf niteliğini geçersiz kılın ve bunu app.response_class
werkzeug.pocoo.org/docs/wrappers/… flask.pocoo.org/docs/api/#flask.Flask.response_class
app.response_class
Simon'un işaret ettiği gibi davranırsanız , aşağıdaki yanıtta belirtildiğiapp.make_response
gibi yanıt örneğinizi almak için kullanmayı unutmayın .
Bu kadar basit
x = "some data you want to return"
return x, 200, {'Content-Type': 'text/css; charset=utf-8'}
Umarım yardımcı olur
Güncelleme: Bu yöntemi hem python 2.x hem de python 3.x ile çalışacağı için kullanın
ve ikincisi birden çok başlık sorununu da ortadan kaldırır.
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
@Simon Sapin'in cevabını beğendim ve yanıtladım. Bununla birlikte, biraz farklı bir çakışma aldı ve kendi dekoratörümü oluşturdum:
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
ve bu şekilde kullanın:
@app.route('/ajax_ddl')
@returns_xml
def ajax_ddl():
xml = 'foo'
return xml
Bence bu biraz daha rahat.
return 'msg', 200
, bu yol açacaktır ValueError: Expected bytes
. Bunun yerine dekoratörü olarak değiştirin return Response(*r, content_type='whatever')
. Tuple, argümanlara açılacaktır. Zarif bir çözüm için teşekkürler!
Verilerinize yanıt almak için make_response yöntemini kullanın . Sonra mimetype özniteliğini ayarlayın . Son olarak şu yanıtı döndürün:
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
resp = app.make_response(xml)
resp.mimetype = "text/xml"
return resp
Response
Doğrudan kullanırsanız , yanıtları ayarlayarak özelleştirme şansını kaybedersiniz app.response_class
. make_response
Metodu, app.responses_class
tepki nesne yapmak için. Burada kendi sınıfınızı oluşturabilir, uygulamanızın onu global olarak kullanmasını sağlayabilirsiniz:
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
daha iyi olduğunu daha iyi açıklamak için cevabımı genişlettimResponse
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
Genellikle Response
nesneyi kendiniz oluşturmak zorunda değilsiniz, çünkü sizin için make_response()
bununla ilgilenecektir.
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
Bir şey daha var, kimsenin bahsetmediği anlaşılıyor, bir after_this_request
şey söylemek istiyorum:
Bu istekten sonra bir işlev yürütür. Bu, yanıt nesnelerini değiştirmek için kullanışlıdır. İşlev yanıt nesnesinden geçirilir ve aynı veya yenisini döndürmek zorundadır.
böylece bunu yapabiliriz after_this_request
, kod şöyle görünmelidir:
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>'
Aşağıdaki yöntemi deneyebilirsiniz (python3.6.2) :
birinci durum :
@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
ikinci durum :
@app.route('/hello')
def hello():
headers={ 'content-type':'text/plain' ,'location':'http://www.stackoverflow.com'}
return '<h1>hello world</h1>',301,headers
Ben Flask kullanıyorum. Ve json dönmek istiyorsanız, bunu yazabilirsiniz:
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)