[python] 파이썬 플라스크, 콘텐츠 유형을 설정하는 방법

Flask를 사용하고 있으며 get 요청에서 XML 파일을 반환합니다. 콘텐츠 형식을 xml로 설정하려면 어떻게합니까?

예 :

@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/


답변

이만큼 간단

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

나는 이것이 조금 더 편안하다고 생각합니다.


답변

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  


답변

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

이 요청 후 기능을 실행합니다. 응답 객체를 수정하는 데 유용합니다. 함수는 응답 객체를 전달받으며 동일하거나 새로운 것을 반환해야합니다.

그래서 우리는 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)