Pregunta

En Pyramid, usando Beaker para sesiones, ¿cómo puedo hacerla para que ciertas respuestas no incluyan cookies?

Actualmente, si me curvo cualquier URL en mi aplicación, recuperaré algo como:

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

No necesito que esa cookie se establezca con todas las solicitudes. Por ejemplo, me gustaría eliminarlo de las solicitudes que tienen el subdominio "API". Intenté cambiar:

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()

a:

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()

Lo que pensé que lo haría para que la fábrica de sesiones no se estableciera en esos casos y, por lo tanto, no hubiera cookies. No entiendo lo que está pasando con el middleware lo suficientemente bien. También estaría bien descubrir una manera de hacerlo para que los objetos de respuesta que tengan un mimetipo "Aplicación/JSON" no incluyan esa cookie. Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Una forma en que podrías hacer esto es usando un NewResponse abonado Eso modificaría la respuesta saliente.

Por ejemplo:

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']

Esta sería una forma de eliminar todas las cookies de todas las respuestas. Otra forma de hacerlo sería crear una nueva fábrica de sesión que verifique si la URL actual es una solicitud de API, y de ser así, no crea una sesión en absoluto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top