programing

플라스크에서 응답 헤더를 설정하려면 어떻게 해야 합니까?

testmans 2023. 7. 19. 21:14
반응형

플라스크에서 응답 헤더를 설정하려면 어떻게 해야 합니까?

내 코드는 다음과 같습니다.

@app.route('/hello', methods=["POST"])
def hello():
    resp = make_response(render_template('hello.html'))
    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

어떻게든 할 방법이 없어요제발 도와주세요.

편집

다음과 같은 POST 요청이 있는 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>

아이디어 있어요?

이 작업은 매우 쉽게 수행할 수 있습니다.

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

플라스크를 보세요.반응 및 플라스크.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

잘 포맷된 HTML 오류 페이지를 제공합니다(컬 명령에 유용).

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

사용하다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

플라스크 문서를 보면,

플라스크.make_response(병)

보기에서 추가 헤더를 설정해야 하는 경우도 있습니다.뷰는 응답 객체를 반환할 필요가 없지만 플라스크 자체에서 응답 객체로 변환된 값을 반환할 수 있으므로, 여기에 헤더를 추가하기가 까다로워집니다.이 함수는 반환을 사용하는 대신 호출할 수 있으며 헤더를 첨부하는 데 사용할 수 있는 응답 개체를 얻을 수 있습니다.

이것이 플라스크 애플리케이션에 헤더를 추가하는 방법이었고 완벽하게 작동했습니다.

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

설명서에 따르면, 응답과 함께 보기 기능에서 헤더를 반환할 수 있습니다.

튜플이 반환되면 튜플의 항목이 추가 정보를 제공할 수 있습니다.이러한 튜플은 형태여야 합니다.(response, status),(response, headers)또는(response, status, headers)상태 값은 상태 코드를 재정의하며 헤더는 추가 헤더 값의 목록 또는 사전이 될 수 있습니다.

예:

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

또는:

@app.route('/hello', methods=["POST"])
def hello():
   return {"foo": "bar"}, 200, {"Access-Control-Allow-Origin": "*"}

나를 위한 이 일

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

Python Flask 응용 프로그램 Flask 프로그램에서 할 수 .flask.g

에서 다을사용플라여스크응용컨그램응방텍헤설답법정더는하를서에음트스를 사용하여 응답 flask.g응용 에서 사용자 지정 및 하는 데 할 수 . 이은 다른 : 수 있는 지정합니다. 이는 다른 파일(예: 미들웨어 등)에서도 액세스할 수 있는 도우미 클래스에서 사용자 지정/동적 응답 헤더를 설정하는 경우 특히 유용합니다.flask.g글로벌이며 해당 요청 스레드에 대해서만 유효합니다.

이 앱에서 호출되는 다른 api/http 호출에서 응답 헤더를 읽고 싶다고 말한 다음 임의 추출하여 이 앱의 응답 헤더로 설정합니다.

코드: 파일: 파일: 파일: 파일: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)

언급URL : https://stackoverflow.com/questions/25860304/how-do-i-set-response-headers-in-flask

반응형