Я использую Flask и возвращаю XML файл из запроса get. Как установить тип содержимого на xml?
например,
@app.route('/ajax_ddl')
def ajax_ddl():
    xml = 'foo'
    header("Content-type: text/xml")
    return xml
Я использую Flask и возвращаю XML файл из запроса get. Как установить тип содержимого на 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')
Фактический тип содержимого основан на параметре mimetype и кодировке (по умолчанию используется UTF-8).
Объекты Response (и request) описаны здесь: 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, код должен выглядеть следующим образом:
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
второй случай:
@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)