পাইথন ফ্লাস্ক, কীভাবে সামগ্রীর প্রকার সেট করবেন


176

আমি ফ্লাস্ক ব্যবহার করছি এবং আমি একটি অনুরোধ থেকে একটি এক্সএমএল ফাইল ফিরে আসছি। আমি কীভাবে কনটেন্ট প্রকারটি এক্সএমএল সেট করব?

যেমন

@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')

প্রকৃত সামগ্রী-প্রকারটি মাইমটাইপ প্যারামিটার এবং চরসেট (ইউটিএফ -8 এ ডিফল্ট) এর উপর ভিত্তি করে।

প্রতিক্রিয়া (এবং অনুরোধ) অবজেক্টগুলি এখানে নথিভুক্ত করা হয়েছে: http://werkzeug.pocoo.org/docs/wrappers/


1
বিশ্বব্যাপী (যেমন: ডিফল্ট) এগুলি এবং অন্যান্য বিকল্পগুলি সেট করা কি সম্ভব?
আর্থলেলন

10
@ ইয়ারথমেলন, শ্রেণীর বৈশিষ্ট্যকে flask.Responseওভাররাইড করে একটি সাবক্লাস তৈরি করুন default_mimetypeএবং সেট করুন app.response_class werkzeug.pocoo.org/docs/wrappers/… flask.pocoo.org/docs/api/#flask.Flask.response_class
সাইমন সাপিন

@ পেয়ারমেলন: আপনি যদি app.response_classসাইমন পয়েন্ট আউট করার মতো সেট করেন তবে নীচের উত্তরে নির্দেশিতapp.make_response মত আপনার রেপন্স উদাহরণটি পেতে ব্যবহার করতে ভুলবেন না
মার্টিন গিজলার

ব্রাউজারগুলি বা পোস্টম্যানের সাথে অনুরোধগুলি এই পদ্ধতির সাথে ভাল কাজ করে, তবে কার্ল ফিরে আসা প্রতিক্রিয়া অবজেক্টের সাথে ভালভাবে কাজ করে না। কার্ল সবেমাত্র "পাওয়া" মুদ্রণ করবে। কার্ল "রিটার্ন সামগ্রী, স্ট্যাটাস_কোড, শিরোনাম" দিয়ে আরও ভাল কাজ করা মনে হয়।
ফুমা

144

এই হিসাবে সহজ

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

আশা করি এটা সাহায্য করবে

আপডেট: এই পদ্ধতিটি ব্যবহার করুন কারণ এটি অজগর 2.x এবং পাইথন 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
সহজ সমাধান। অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত
ওমর ডাগান

একটি ত্রুটি রয়েছে: এটি আপনাকে কেবল শিরোনাম যুক্ত করতে দেয়। যখন আমি এটি করেছি, আমি প্রতিক্রিয়া হিসাবে দুটি কন্টেন্ট-টাইপ শিরোনাম দিয়ে শেষ করেছি - একটি ডিফল্ট এবং একটি যুক্ত করে।
ওমিক্রন

1
@ মাইক্রন আমি উত্তরটি আপডেট করেছি, নতুন পদ্ধতিটি ব্যবহার করা উচিত try
হর্ষ দাফটারি

48

আমি @ সাইমন সাপিনের উত্তরটি পছন্দ এবং পছন্দ করেছি। আমি কিছুটা আলাদা ট্যাক্স নিয়ে শেষ করেছিলাম, তবে আমার নিজস্ব ডেকরেটার তৈরি করেছি:

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

আপনার ডেটার সাথে প্রতিক্রিয়া পেতে Make_response পদ্ধতি ব্যবহার করুন । তারপরে মাইমটাইপ বৈশিষ্ট্যটি সেট করুন । শেষ পর্যন্ত এই প্রতিক্রিয়াটি ফিরিয়ে দিন:

@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  

এটি মূলত @ সাইমনসাপিনের গৃহীত উত্তরটি পুনরায় প্রকাশিত।
J0e3gan

@ J0e3gan ধন্যবাদ। ব্যবহারের make_responseচেয়ে কেন ব্যবহার করা আরও ভাল তা ব্যাখ্যা করার জন্য আমি আমার উত্তরটি প্রসারিত করেছিResponse
মারিয়ানা ভ্যাসালো 21

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

আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন (পাইথন ৩..6.২) :

কেস ওয়ান

@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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.