पायथन फ्लास्क, सामग्री प्रकार कैसे सेट करें


176

मैं फ्लास्क का उपयोग कर रहा हूं और मैं एक एक्सएमएल फाइल को एक अनुरोध प्राप्त करता हूं। मैं 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')

वास्तविक सामग्री-प्रकार mimetype पैरामीटर और charset (UTF-8 के लिए डिफ़ॉल्ट) पर आधारित है।

प्रतिक्रिया (और अनुरोध) वस्तुओं को यहां प्रलेखित किया गया है: http://werkzeug.pocoo.org/docs/wrappers/


1
क्या वैश्विक स्तर पर इन और अन्य विकल्पों को सेट करना संभव है (यानी: डिफ़ॉल्ट)?
अर्थमीलोन

10
@earthmeLon, वर्ग विशेषता को flask.Responseओवरराइड करें default_mimetype, और सेट करें कि app.response_class werkzeug.pocoo.org/docs/wrappers/… flask.pocoo.org/docs/api/#flask.Flask.response_class
साइमन

@earthmeLon: यदि आप app.response_classसाइमन की तरह सेट करते हैं, तो नीचे दिए गए उत्तर में दिए गए उत्तर कीapp.make_response तरह अपने रिपीटी उदाहरण को प्राप्त करने के लिए उपयोग करना याद रखें ।
मार्टिन गिस्लर 15

ब्राउज़र या पोस्टमैन के साथ अनुरोध इस दृष्टिकोण के साथ ठीक काम करते हैं, हालांकि कर्ल लौटे रिस्पॉन्स ऑब्जेक्ट के साथ अच्छी तरह से काम नहीं करता है। कर्ल सिर्फ "फाउंड" प्रिंट करेगा। कर्ल के साथ "वापसी सामग्री, स्थिति_कोड, हेडर" बेहतर काम करने लगते हैं।
फ़ूमा

144

यह जितना सरल है

x = "some data you want to return"
return x, 200, {'Content-Type': 'text/css; charset=utf-8'}

आशा करता हूँ की ये काम करेगा

अद्यतन: इस विधि का उपयोग करें क्योंकि यह अजगर २.x और अजगर ३.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
सबसे सरल उपाय। निश्चित रूप से स्वीकृत उत्तर होना चाहिए
ओमर डेगन

एक खामी है: यह आपको केवल एडीडी हेडर की अनुमति देता है। जब मैंने इसे किया, मैंने प्रतिक्रिया में दो सामग्री-प्रकार हेडर के साथ समाप्त किया - डिफ़ॉल्ट एक और एक जोड़ा।
omikron

1
@omikron मैंने उत्तर को अपडेट कर दिया है, यह काम करने की नई विधि का प्रयास करें।
हर्ष दफ्तरी

48

मुझे @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

मुझे लगता है कि यह थोड़ा अधिक आरामदायक है।


3
प्रतिक्रिया और स्थिति कोड दोनों को वापस करते समय return 'msg', 200, यह आगे बढ़ेगा ValueError: Expected bytes। इसके बजाय, डेकोरेटर को बदलें return Response(*r, content_type='whatever')। यह बहस के लिए टपल को खोल देगा। हालांकि, एक सुंदर समाधान के लिए धन्यवाद!
फेलिक्स

24

अपने डेटा के साथ प्रतिक्रिया प्राप्त करने के लिए मेक_पर्सन विधि का उपयोग करें । फिर mimetype विशेषता सेट करें । अंत में यह प्रतिक्रिया वापस करें:

@app.route('/ajax_ddl')
def ajax_ddl():
    xml = 'foo'
    resp = app.make_response(xml)
    resp.mimetype = "text/xml"
    return resp

यदि आप Responseसीधे उपयोग करते हैं, तो आप सेटिंग द्वारा प्रतिक्रियाओं को अनुकूलित करने का मौका खो देते हैं app.response_classmake_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_responseबेहतर तरीके से बताया कि उपयोग करने से बेहतर क्यों हैResponse
मैरिएना वासलो

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
मुझे लगता है कि यह उत्तर महत्वपूर्ण है क्योंकि यह स्पष्ट करता है कि रेंडर_टैम्पलेट से किसी चीज़ पर हेडर कैसे बदलें।
एक हेटिंगर

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) method

मामला एक :

@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

मैं फ्लास्क का उपयोग कर रहा हूं। और यदि आप जसन को वापस करना चाहते हैं, तो आप इसे लिख सकते हैं:

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.