답변:
이렇게 해보십시오 :
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/
flask.Response
재정의하고 werkzeug.pocoo.org/docs/wrappers/…default_mimetype
와 같이 설정합니다. flask.pocoo.org/docs/api/#flask.Flask.response_classapp.response_class
app.response_class
Simon이 지적한 것처럼 설정하면 아래 답변에서 지적한app.make_response
것처럼 응답 인스턴스를 얻는 데 사용 하십시오 .
이만큼 간단
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 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
나는 이것이 조금 더 편안하다고 생각합니다.
return 'msg', 200
이 결과가 나타납니다 ValueError: Expected bytes
. 대신 데코레이터를로 변경하십시오 return Response(*r, content_type='whatever')
. 튜플을 인수로 압축 해제합니다. 그러나 우아한 해결책을 주셔서 감사합니다!
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
응답 객체를 만듭니다. 이것으로 당신은 당신 자신의 클래스를 만들 수 있고, 응용 프로그램이 전역 적으로 사용하도록 추가 할 수 있습니다 :
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
Response
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
일반적으로 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
코드를 다음과 같이 할 수 있습니다.
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>'
다음 방법을 시도해 볼 수 있습니다 (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
사례 2 :
@app.route('/hello')
def hello():
headers={ 'content-type':'text/plain' ,'location':'http://www.stackoverflow.com'}
return '<h1>hello world</h1>',301,headers
Flask를 사용하고 있으며 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)