用于Ajax请求的Pyramid CORS

drn*_*gis 12 python cors pyramid

是否可以自动将Access-Control-Allow-Origin标题添加到由X-Requested-With金字塔中的ajax请求(带标题)启动的所有响应中?

Wic*_*man 17

有几种方法可以做到这一点:1)像drnextgis这样的自定义请求工厂,NewRequest事件处理程序或补间.补间几乎肯定不是正确的方法,所以我不会表明这一点.这是事件处理程序版本:

def add_cors_headers_response_callback(event):
    def cors_headers(request, response):
        response.headers.update({
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'POST,GET,DELETE,PUT,OPTIONS',
        'Access-Control-Allow-Headers': 'Origin, Content-Type, Accept, Authorization',
        'Access-Control-Allow-Credentials': 'true',
        'Access-Control-Max-Age': '1728000',
        })
    event.request.add_response_callback(cors_headers)

from pyramid.events import NewRequest
config.add_subscriber(add_cors_headers_response_callback, NewRequest)
Run Code Online (Sandbox Code Playgroud)


drn*_*gis 7

我用set_request_factory以下方法解决了这个问题:

from pyramid.request import Request
from pyramid.request import Response

def request_factory(environ):
    request = Request(environ)
    if request.is_xhr:
        request.response = Response()
        request.response.headerlist = []
        request.response.headerlist.extend(
            (
                ('Access-Control-Allow-Origin', '*'),
                ('Content-Type', 'application/json')
            )
        )
    return request

config.set_request_factory(request_factory)
Run Code Online (Sandbox Code Playgroud)

  • 执行此操作会打开服务器以从*ANY*域进行攻击; 包含域名的白名单而不是单个通配符会更安全. (4认同)
  • honestduane在这里提出了一个非常好的观点.如果您要为公共数据创建API(比方说天气信息或公共交通数据),这可能是正确的大腿. (2认同)
  • 如果您使用请求工厂,请确保您的请求处理程序从请求中获取响应 (`response = request.response`),而不是创建一个新响应 (`response = Response(...)`)。在后一种情况下,您的标头将不会被包含在内。 (2认同)