이것은 내 코드입니다.
@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
그러나 어쨌든 나는 이것을 할 수 없습니다. 도와주세요.
편집하다
다음과 같이 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
flask.Response 와 flask.make_response ()를 보세요.
그러나 다른 문제가 있다는 것을 알려주는 이유는에서 after_request
올바르게 처리해야 했기 때문 입니다.
편집
나는 당신이 이미 make_response
그것을하는 방법 중 하나를 사용 하고 있음을 알았 습니다. 이전에 말했듯이 after_request
잘 작동 했어야했습니다. curl을 통해 끝점을 치고 헤더가 무엇인지 확인하십시오.
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
Access-Control-Allow-Origin 헤더에 주목하십시오.
편집 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
다음과 같은 Flask 사용
@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 (* args)
보기에 추가 헤더를 설정해야하는 경우가 있습니다. 뷰는 응답 객체를 반환 할 필요가 없지만 Flask 자체에서 응답 객체로 변환 된 값을 반환 할 수 있기 때문에 헤더를 추가하는 것이 까다로워집니다. 이 함수는 반환을 사용하는 대신 호출 할 수 있으며 헤더를 첨부하는 데 사용할 수있는 응답 객체를 얻게됩니다.
답변
이것은 나를위한 일
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()
답변
이것은 플라스크 응용 프로그램에 헤더를 추가 한 방법이며 완벽하게 작동했습니다.
@app.after_request
def add_header(response):
response.headers['X-Content-Type-Options'] = 'nosniff'
return response
답변
Flask 애플리케이션 컨텍스트를 사용하여 Python Flask 애플리케이션에서 응답 헤더를 설정할 수 있습니다. flask.g
Flask 응용 프로그램 컨텍스트에서 응답 헤더를 설정하는이 방법 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)