Python,Flask:如何为所有响应设置响应 header
Python, Flask: How to set response header for all responses
我想将我所有的 http headers 响应设置为如下内容:
response.headers["X-Frame-Options"] = "SAMEORIGIN"
我检查了 this question,但它只更改了一个特定控制器的 header。我想在 "before_request" 函数中更改我的所有 header 类似于以下逻辑。我该怎么做?
@app.before_request
def before_request():
# response.headers["X-Frame-Options"] = "SAMEORIGIN"
在 @app.after_request()
hook 中设置 header,此时您有响应 object 将 header 设置为:
@app.after_request
def apply_caching(response):
response.headers["X-Frame-Options"] = "SAMEORIGIN"
return response
此挂钩运行时flask.request
context仍然可用,因此此时您仍然可以根据请求改变响应。
@app.after_request() hook
不适合我的用例。
我的用例如下:我有一个 google 云函数,我想为所有响应设置 CORS headers。可能有多个响应,因为我必须验证输入并且 return 如果有问题,我必须处理数据并且可能 return 如果出现问题等。所以我创建了一个辅助函数如下:
# Helper function to return a response with status code and CORS headers
def prepare_response(res_object, status_code):
response = flask.jsonify(res_object)
response.headers.set('Access-Control-Allow-Origin', '*')
response.headers.set('Access-Control-Allow-Methods', 'GET, POST')
return response, status_code
因此,当我想要 return 响应时(始终使用 CORS headers),我现在可以调用此函数,并且我不会复制启用所需的 response.headers 设置CORS.
我们可以使用 WSGI 中间件
为 Python Flask 应用程序中的所有响应设置响应 headers
这种使用中间件在 Flask 应用程序上下文中设置响应的方式 headers 是线程安全的,可用于设置自定义和动态属性,阅读请求 headers 如果我们是设置 custom/dynamic 来自任何助手 class 的响应 headers。
文件: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) # reading all request headers
environ[self._header_name] = request_id_header
def new_start_response(status, response_headers, exc_info=None):
"""
set custom response headers
"""
# set the above captured request header as response header
response_headers.append((self._header_name, request_id_header))
# example to access flask.g values set in any class thats part of the Flask app & then 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)
从主调用中间件class
文件: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)
我想将我所有的 http headers 响应设置为如下内容:
response.headers["X-Frame-Options"] = "SAMEORIGIN"
我检查了 this question,但它只更改了一个特定控制器的 header。我想在 "before_request" 函数中更改我的所有 header 类似于以下逻辑。我该怎么做?
@app.before_request
def before_request():
# response.headers["X-Frame-Options"] = "SAMEORIGIN"
在 @app.after_request()
hook 中设置 header,此时您有响应 object 将 header 设置为:
@app.after_request
def apply_caching(response):
response.headers["X-Frame-Options"] = "SAMEORIGIN"
return response
此挂钩运行时flask.request
context仍然可用,因此此时您仍然可以根据请求改变响应。
@app.after_request() hook
不适合我的用例。
我的用例如下:我有一个 google 云函数,我想为所有响应设置 CORS headers。可能有多个响应,因为我必须验证输入并且 return 如果有问题,我必须处理数据并且可能 return 如果出现问题等。所以我创建了一个辅助函数如下:
# Helper function to return a response with status code and CORS headers
def prepare_response(res_object, status_code):
response = flask.jsonify(res_object)
response.headers.set('Access-Control-Allow-Origin', '*')
response.headers.set('Access-Control-Allow-Methods', 'GET, POST')
return response, status_code
因此,当我想要 return 响应时(始终使用 CORS headers),我现在可以调用此函数,并且我不会复制启用所需的 response.headers 设置CORS.
我们可以使用 WSGI 中间件
为 Python Flask 应用程序中的所有响应设置响应 headers这种使用中间件在 Flask 应用程序上下文中设置响应的方式 headers 是线程安全的,可用于设置自定义和动态属性,阅读请求 headers 如果我们是设置 custom/dynamic 来自任何助手 class 的响应 headers。
文件: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) # reading all request headers
environ[self._header_name] = request_id_header
def new_start_response(status, response_headers, exc_info=None):
"""
set custom response headers
"""
# set the above captured request header as response header
response_headers.append((self._header_name, request_id_header))
# example to access flask.g values set in any class thats part of the Flask app & then 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)
从主调用中间件class
文件: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)