我使用Flask和我从get请求返回一个XML文件。如何设置内容类型为xml ?
e.g.
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
header("Content-type: text/xml")
return xml
我使用Flask和我从get请求返回一个XML文件。如何设置内容类型为xml ?
e.g.
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
header("Content-type: text/xml")
return xml
当前回答
试着这样做:
from flask import Response
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
return Response(xml, mimetype='text/xml')
实际的Content-Type基于mimetype参数和字符集(默认为UTF-8)。
响应(和请求)对象记录在这里:http://werkzeug.pocoo.org/docs/wrappers/
其他回答
您可以尝试以下方法(python3.6.2):
案例一:
@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
案例二:
@app.route('/hello')
def hello():
headers={ 'content-type':'text/plain' ,'location':'http://www.stackoverflow.com'}
return '<h1>hello world</h1>',301,headers
如果你想返回json,你可以这样写:
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)
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
试着这样做:
from flask import Response
@app.route('/ajax_ddl')
def ajax_ddl():
xml = 'foo'
return Response(xml, mimetype='text/xml')
实际的Content-Type基于mimetype参数和字符集(默认为UTF-8)。
响应(和请求)对象记录在这里:http://werkzeug.pocoo.org/docs/wrappers/
我喜欢并点赞了@Simon Sapin的回答。然而,我最终采取了稍微不同的策略,创建了我自己的装饰器:
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
这样使用它:
@app.route('/ajax_ddl')
@returns_xml
def ajax_ddl():
xml = 'foo'
return xml
我觉得这个稍微舒服一点。
通常您不必自己创建Response对象,因为make_response()将为您处理它。
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
还有一件事,似乎没有人提到after_this_request,我想说的是:
after_this_request
在这个请求之后执行一个函数。这对于修改响应对象非常有用。函数被传递给响应对象,并且必须返回相同的或新的响应对象。
所以我们可以用after_this_request来做,代码应该是这样的:
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>'