Python Flask,如何设置内容types

我正在使用Flask,并从get请求中返回一个XML文件。 如何设置内容types?

例如

@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') 

实际的内容types是基于mimetype参数和字符集(默认为UTF-8)。

响应(和请求)对象logging在这里: http : //werkzeug.pocoo.org/docs/wrappers/

像这样简单

 x = "some data you want to return" return x, 200, {'Content-Type': 'text/css; charset=utf-8'} 

希望能帮助到你

更新:使用这种方法,因为它可以同时用于python 2.x和python 3.x

其次它也消除了多头问题。

 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沙宾的答案。 我结束了稍微不同的方式,然而,创造了我自己的装饰者:

 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 

我觉得这样稍微舒服些。

使用make_response方法获取数据的响应。 然后设置mimetype属性 。 最后回复这个回复:

 @app.route('/ajax_ddl') def ajax_ddl(): xml = 'foo' resp = app.make_response(xml) resp.mimetype = "text/xml" return resp 

如果直接使用Response ,则通过设置app.response_class失去了自定义响应的机会。 make_response方法使用app.responses_class来创build响应对象。 在这里你可以创build你自己的类,添加让你的应用程序在全局使用它:

 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 

通常你不需要自己创buildResponse对象,因为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

此请求后执行一个function。 这对修改响应对象很有用。 该函数传递响应对象,并且必须返回相同的或新的。

所以我们可以用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>'