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


176

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

예 :

@app.route('/ajax_ddl')
def ajax_ddl():
    xml = 'foo'
    header("Content-type: text/xml")
    return xml

답변:


255

이렇게 해보십시오 :

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/


1
이러한 옵션과 다른 옵션을 전역 수준 (예 : 기본값)으로 설정할 수 있습니까?
earthmeLon

10
@earthmeLon,의 하위 클래스를 만들고 클래스 속성을 flask.Response재정의하고 werkzeug.pocoo.org/docs/wrappers/…default_mimetype 와 같이 설정합니다. flask.pocoo.org/docs/api/#flask.Flask.response_classapp.response_class
Simon Sapin

@earthmeLon : app.response_classSimon이 지적한 것처럼 설정하면 아래 답변에서 지적한app.make_response 것처럼 응답 인스턴스를 얻는 데 사용 하십시오 .
Martin Geisler

브라우저 또는 우편 배달부 요청은이 방법으로 잘 작동하지만 curl은 반환 된 Response 객체에서 제대로 작동하지 않습니다. 컬은 "발견"을 인쇄합니다. curl을 사용하면 "반환 내용, status_code, 헤더"가 더 잘 작동하는 것 같습니다.
fuma

144

이만큼 간단

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

15
가장 간단한 솔루션. 확실히 대답해야합니다
Omer Dagan

단점이 있습니다. 헤더 만 추가 할 수 있습니다. 내가 그것을했을 때, 나는 응답으로 두 개의 Content-Type 헤더로 끝났다-기본 헤더와 추가 헤더.
omikron 2019

1
@ omikron 나는 대답을 업데이트하고 새로운 방법을 시도해보십시오.
Harsh Daftary

48

@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

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


3
응답과 같은 상태 코드를 모두 반환하면 return 'msg', 200이 결과가 나타납니다 ValueError: Expected bytes. 대신 데코레이터를로 변경하십시오 return Response(*r, content_type='whatever'). 튜플을 인수로 압축 해제합니다. 그러나 우아한 해결책을 주셔서 감사합니다!
Felix

24

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  

이것은 본질적으로 @SimonSapin의 허용 된 답변이 다시 포장되었습니다.
J0e3gan

@ J0e3gan 감사합니다. make_responseResponse
Marianna Vassallo

14
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

2
이 답변은 render_template에서 헤더를 변경하는 방법을 분명히하기 때문에 중요하다고 생각합니다.
Hettinger

5

일반적으로 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>'

4

다음 방법을 시도해 볼 수 있습니다 (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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.