Можно ли автоматически добавлять заголовок Access-Control-Allow-Origin
ко всем ответам, которые были инициированы с помощью запроса ajax (с заголовком X-Requested-With
) в Pyramid?
Пирамида CORS для запросов Ajax
Ответ 1
Я решил проблему, используя 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)
Ответ 2
Есть несколько способов сделать это: 1) пользовательский запрос factory, такой как 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)
Ответ 3
Я могу отправить файл с Ajax с сервера на другой сервер:
import uuid
from pyramid.view import view_config
from pyramid.response import Response
class FManager:
def __init__(self, request):
self.request = request
@view_config(route_name='f_manager', request_method='POST', renderer='json')
def post(self):
file_ = self.request.POST.items()
content_type = str(file_[0][1].type).split('/')
file_[0][1].filename = str(uuid.uuid4()) + '.' + content_type[1]
file_id = self.request.storage.save(file_[0][1])
response = Response(body="{'data':'success'}")
response.headers.update({
'Access-Control-Allow-Origin': '*',
})
return response
Ответ 4
Вот еще одно решение:
from pyramid.events import NewResponse, subscriber
@subscriber(NewResponse)
def add_cors_headers(event):
if event.request.is_xhr:
event.response.headers.update({
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET',
})