Как в пирамиде можно запретить установку файлов cookie в определенных ответах?
В Pyramid, используя лабораторный стакан для сеансов, как я могу сделать так, чтобы определенные ответы не включали файлы cookie?
В настоящее время, если я сверну любой URL в моем приложении, я получу что-то вроде:
HTTP/1.1 200 OK
Server: nginx/1.2.6
Date: Thu, 07 Nov 2013 02:14:45 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 776
Connection: keep-alive
Set-Cookie: beaker.session.id=0a6d945c09884ca29d73bc4ff4d09ff0; expires=Thu, 07-Nov-2013 03:14:45 GMT; httponly; Path=/; secure
Мне не нужно, чтобы этот cookie устанавливался со всеми запросами. Например, я хотел бы удалить его из запросов с поддоменом "api". Я пытался изменить:
def main(global_config, **settings):
session_factory = session_factory_from_settings(settings)
config = Configurator(settings=settings, root_factory=get_root)
config.set_session_factory(session_factory)
return config.make_wsgi_app()
чтобы:
def main(global_config, **settings):
session_factory = session_factory_from_settings(settings)
config = Configurator(settings=settings, root_factory=get_root)
#config.set_session_factory(session_factory)
return MethodOverride(config, session_factory)
class MethodOverride(object):
def __init__(self, config, session_factory):
import copy
self.config = copy.deepcopy(config)
config.set_session_factory(session_factory)
self.application = config.make_wsgi_app()
def __call__(self, environ, start_response):
if "api" == environ['HTTP_HOST'].split('.')[0]:
self.application = self.config.make_wsgi_app()
То, что я думал, сделало бы так, чтобы фабрика сессий не была установлена в тех случаях, и поэтому никакие куки. Я не очень хорошо понимаю, что происходит с промежуточным программным обеспечением. Я также неплохо бы найти способ сделать так, чтобы объекты Response, имеющие mimetype "application/json", не включали этот cookie. Любая помощь приветствуется.
1 ответ
Один из способов сделать это - использовать NewResponse
подписчик, который будет изменять исходящий ответ.
Например:
def new_response_subscriber(event):
request = event.request
response = event.response
if "api" == request.environ['HTTP_HOST'].split('.')[0]:
if 'Set-Cookie' in response.headers:
del response.headers['Set-Cookie']
Это был бы один из способов удалить все куки из всех ответов. Другой способ сделать это - создать новую фабрику сеансов, которая проверяет, является ли текущий URL запросом API, и если да, то вообще не создает сеанс.