আমি কীভাবে ফ্লাস্কে প্রতিক্রিয়া শিরোনাম সেট করব?


107

এটি আমার কোড:

@app.route('/hello', methods=["POST"])
def hello():
    resp = make_response()
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

তবে, যখন আমি ব্রাউজার থেকে আমার সার্ভারে একটি অনুরোধ করি তখন আমি এই ত্রুটিটি পাই:

XMLHttpRequest cannot load http://localhost:5000/hello. 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

আমি অনুরোধটির "পরে" প্রতিক্রিয়া শিরোনামগুলি সেট করেও এই পদ্ধতির চেষ্টা করেছি:

@app.after_request
def add_header(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response

কোন পাশা. আমি একই ত্রুটি পেয়েছি। রুট ফাংশনটিতে কেবল প্রতিক্রিয়া শিরোনাম সেট করার কোনও উপায় আছে? এর মতো কিছু আদর্শ হবে:

@app.route('/hello', methods=["POST"])
    def hello(response): # is this a thing??
        response.headers['Access-Control-Allow-Origin'] = '*'
        return response

তবে আমি এটি করতে পারি না। সাহায্য করুন.

সম্পাদনা

যদি আমি পোস্টের অনুরোধের সাথে urlটি কার্ল করি তবে:

curl -iX POST http://localhost:5000/hello

আমি এই প্রতিক্রিয়া পেয়েছি:

HTTP/1.0 500 INTERNAL SERVER ERROR
Content-Type: text/html
Content-Length: 291
Server: Werkzeug/0.9.6 Python/2.7.6
Date: Tue, 16 Sep 2014 03:58:42 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.</p>

কোন ধারনা?

উত্তর:


102

আপনি এটি খুব সহজেই করতে পারেন:

@app.route("/")
def home():
    resp = flask.Response("Foo bar baz")
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

flask.Response এবং flask.make_response ()

তবে কিছু আমাকে বলছে আপনার আর একটি সমস্যা আছে, কারণ after_requestএটিও সঠিকভাবে পরিচালনা করা উচিত ছিল।

সম্পাদনা
আমি সবেমাত্র লক্ষ্য করেছি যে আপনি ইতিমধ্যে ব্যবহার করছেন make_responseযা এটি করার অন্যতম উপায়। আমি আগে যেমন বলেছিলাম, after_requestপাশাপাশি কাজ করা উচিত ছিল। কার্লের মাধ্যমে শেষ পয়েন্টটি আঘাত করার চেষ্টা করুন এবং দেখুন শিরোনামগুলি কী:

curl -i http://127.0.0.1:5000/your/endpoint

তোমার দেখা উচিত

> curl -i 'http://127.0.0.1:5000/'
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 11
Access-Control-Allow-Origin: *
Server: Werkzeug/0.8.3 Python/2.7.5
Date: Tue, 16 Sep 2014 03:47:13 GMT

অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স শিরোনাম হিসাবে চিহ্নিত করা হচ্ছে।

সম্পাদনা 2
যেমনটি আমি সন্দেহ করেছি, আপনি 500 পাচ্ছেন যাতে আপনি যে শিরোনামটি ভেবেছিলেন সেট করেন না। app.debug = Trueআপনি অ্যাপ্লিকেশন শুরু করার আগে যুক্ত করার চেষ্টা করুন এবং আবার চেষ্টা করুন। আপনার সমস্যার মূল কারণটি দেখানো কিছু আউটপুট পাওয়া উচিত।

উদাহরণ স্বরূপ:

@app.route("/")
def home():
    resp = flask.Response("Foo bar baz")
    user.weapon = boomerang
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

নীচে এটি সহ একটি সুন্দর বিন্যাসিত এইচটিএমএল ত্রুটি পৃষ্ঠা দেয় (কার্ল কমান্ডের জন্য সহায়ক)

Traceback (most recent call last):
...
  File "/private/tmp/min.py", line 8, in home
    user.weapon = boomerang
NameError: global name 'boomerang' is not defined

27

make_responseফ্লাস্কের ব্যবহারের মতো কিছু

@app.route("/")
def home():
    resp = make_response("hello") #here you could use make_response(render_template(...)) too
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

ফ্লাস্ক ডক্স থেকে ,

flask.make_response (* আরগস)

কখনও কখনও একটি ভিউতে অতিরিক্ত শিরোনাম সেট করা প্রয়োজন। যেহেতু দর্শনগুলিতে প্রতিক্রিয়া অবজেক্টগুলি ফিরিয়ে দিতে হয় না তবে ফ্লাস্ক নিজেই কোনও প্রতিক্রিয়াতে রূপান্তরিত করে এমন কোনও মান ফেরত দিতে পারে, এটিতে শিরোনাম যুক্ত করা জটিল হয়ে ওঠে। এই ফাংশনটি রিটার্ন ব্যবহার না করে কল করা যেতে পারে এবং আপনি একটি প্রতিক্রিয়া অবজেক্ট পাবেন যা আপনি শিরোনাম সংযুক্ত করতে ব্যবহার করতে পারেন।



6

আমার জন্য এই কাজ

from flask import Flask
from flask import Response

app = Flask(__name__)

@app.route("/")
def home():
    return Response(headers={'Access-Control-Allow-Origin':'*'})

if __name__ == "__main__":
    app.run()

4
স্বীকৃতিটিও return Response(headers={'Access-Control-Allow-Origin':'*'})আমার কাছে পরিষ্কার দেখায়।
হারমান

6

এটি আমার ফ্লাস্ক অ্যাপ্লিকেশনটিতে আমার শিরোনামগুলি যুক্ত করেছিল এবং এটি পুরোপুরি কার্যকর হয়েছিল

@app.after_request
def add_header(response):
    response.headers['X-Content-Type-Options'] = 'nosniff'
    return response

0

আমরা পাইথন ফ্লাস্ক অ্যাপ্লিকেশনটিতে ফ্লেস্ক অ্যাপ্লিকেশন প্রসঙ্গটি ব্যবহার করে প্রতিক্রিয়া শিরোনাম সেট করতে পারি flask.g

ফ্লাস্ক অ্যাপ্লিকেশন প্রসঙ্গে ব্যবহার করে প্রতিক্রিয়া শিরোনাম নির্ধারণের এই উপায়টি flask.gথ্রেড নিরাপদ এবং অ্যাপ্লিকেশনের যে কোনও ফাইল থেকে কাস্টম এবং গতিশীল বৈশিষ্ট্যগুলি সেট করতে ব্যবহার করা যেতে পারে, এটি বিশেষত সহায়ক যদি আমরা কোনও সহায়ক শ্রেণীর কাস্টম / গতিশীল প্রতিক্রিয়া শিরোনাম সেট করে থাকি তবে অন্য যে কোনও ফাইল থেকেও অ্যাক্সেস করা উচিত (যেমন মিডলওয়্যার ইত্যাদি বলুন), flask.gএটি বৈশ্বিক এবং কেবলমাত্র অনুরোধের থ্রেডের জন্য বৈধ।

যদি আমি এই অ্যাপ্লিকেশন থেকে কল করা অন্য একটি এপিআই / এইচটিপি কল থেকে প্রতিক্রিয়া শিরোনামটি পড়তে চাই এবং বলুন এবং তারপরে যেকোনটি বের করুন এবং এই অ্যাপ্লিকেশনের জন্য প্রতিক্রিয়া শিরোনাম হিসাবে সেট করুন।

নমুনা কোড: ফাইল: helper.py

import flask
from flask import request, g
from multidict import CIMultiDict
from asyncio import TimeoutError as HttpTimeout
from aiohttp import ClientSession

    def _extract_response_header(response)
      """
      extracts response headers from response object 
      and stores that required response header in flask.g app context
      """
      headers = CIMultiDict(response.headers)
      if 'my_response_header' not in g:
        g.my_response_header= {}
        g.my_response_header['x-custom-header'] = headers['x-custom-header']


    async def call_post_api(post_body):
      """
      sample method to make post api call using aiohttp clientsession
      """
      try:
        async with ClientSession() as session:
          async with session.post(uri, headers=_headers, json=post_body) as response:
            responseResult = await response.read()
            _extract_headers(response, responseResult)
            response_text = await response.text()
      except (HttpTimeout, ConnectionError) as ex:
        raise HttpTimeout(exception_message)

ফাইল: middleware.py

import flask
from flask import request, g

class SimpleMiddleWare(object):
    """
    Simple WSGI middleware
    """

    def __init__(self, app):
        self.app = app
        self._header_name = "any_request_header"

    def __call__(self, environ, start_response):
        """
        middleware to capture request header from incoming http request
        """
        request_id_header = environ.get(self._header_name)
        environ[self._header_name] = request_id_header

        def new_start_response(status, response_headers, exc_info=None):
            """
            set custom response headers
            """
            # set the request header as response header
            response_headers.append((self._header_name, request_id_header))
            # this is trying to access flask.g values set in helper class & set that as response header
            values = g.get(my_response_header, {})
            if values.get('x-custom-header'):
                response_headers.append(('x-custom-header', values.get('x-custom-header')))
            return start_response(status, response_headers, exc_info)

        return self.app(environ, new_start_response)

মিডলওয়্যারের মূল শ্রেণি থেকে কল করা

ফাইল: main.py

from flask import Flask
import asyncio
from gevent.pywsgi import WSGIServer
from middleware import SimpleMiddleWare

    app = Flask(__name__)
    app.wsgi_app = SimpleMiddleWare(app.wsgi_app)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.