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