Domanda

Nella piramide, usando il becher per le sessioni, come posso renderlo in modo che alcune risposte non includano i cookie?

Attualmente se arricchisco qualsiasi URL sulla mia app, tornerò qualcosa del tipo:

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

Non ho bisogno che quel cookie sia impostato con tutte le richieste. Ad esempio, vorrei rimuoverlo da richieste che hanno la "API" del sottodominio. Ho provato a cambiare:

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

Che pensavo avrebbe fatto in modo che la fabbrica di sessioni non fosse impostata in quei casi e quindi nessun cookie. Non capisco cosa stia succedendo abbastanza bene con il middleware. Starei anche bene per capire un modo per renderlo così che gli oggetti di risposta che hanno un mimetype "Application/JSON" non includono quel cookie. Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

Un modo in cui potresti farlo è usare un NewResponse abbonato Ciò modificherebbe la risposta in uscita.

Per esempio:

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

Questo sarebbe un modo per rimuovere tutti i cookie da tutte le risposte. Un altro modo per farlo sarebbe quello di creare una nuova fabbrica di sessioni che controlla se l'URL corrente è una richiesta API e, in tal caso, non crea affatto una sessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top