2013-03-21 21 views
8

Używam najnowszych sesji klienckich Flask/Werkzeug (Flask 0.9) do utrzymywania informacji między żądaniami. Sesja nie jest ustawiona jako trwała (jak mi dobrze, gdy ciasteczko jest usuwane, gdy przeglądarka jest zamknięta).Sesja kolby zapomina wpisu między żądaniami

Mój problem jest następujący:

używam kodu po stronie serwera, aby wypełnić zmiennej sesji kolby z wpisem. Po tym, zmienna sesji wygląda mniej więcej tak:

<SecureCookieSession {u'items': SOMENOTVERYIMPORTANTDICTIONARY}, '_fresh': True, 'user_id': u'1', 'csrf': '0aef1995cdf2cxx0233fdf3321d17fc7267f3b32', '_id': 'someUNIQUEcode'}*> 

używam tej informacji do renderowania strony, która wykonuje żądania GET (poprzez JQuery) do tej samej aplikacji kolby, ale nagle słownika zawierającego „elementy” wpis w sesji zniknął:

<SecureCookieSession {'_fresh': True, 'user_id': u'1', 'csrf': '0aef1995cdf2cxx0233fdf3321d17fc7267f3b32', '_id': 'someUNIQUEcode'}> 

zrobiłem jakiś wyszukiwanie wokół, i myślę, że może to być związane z faktem, że jestem testowania na localhost (127.0.0.1 nie jest taka sama jak localhost). Poprawiłem plik hosts i dodałem wpis "dev.localhost", aby upewnić się, że wszystkie żądania pochodzą od tego samego hosta.

Panel deweloperski przeglądarki (Chrome) pokazuje dokładnie te same identyfikatory plików cookie sesji wysyłanych na serwer. Ponadto, ustawienie session.modified = True nie pomaga.

Jedyną rzeczą, która zmienia się między żądaniami jest

__utmb=122666782.18.10.1363877633 

na pierwsze żądanie (ten, który zapełnia wpis items) vs. drugiego wniosku

__utmb=122666782.19.10.1363877633 

myśląc, że to może być nadal coś związanego z Ajaxem. Przetestowałem zawartość zmiennej sesji po prostym przeładowaniu strony: wpis items jest nadal nieobecny w sesji.

Każda pomoc zostanie bardzo doceniona.

+0

Może to pomóc http://stackoverflow.com/questions/13760008/why-do-some-flask-session-values-disappear-the-session-after-closing-the-br – codegeek

+0

Czy tylko wpis "items" został usunięty, czy jest to coś, co ustawiłeś w sesji? –

+0

@codegeek Zanim opublikowałem moje pytanie, rzuciłem okiem na ten wpis i założyłem, że może to być problem z ciasteczkami między hostami. Ustawiłem nazwę hosta na 'localhost.dev', aby uniknąć pomyłki między' localhost' i '127.0.0.1'. Próbowałem także jawnie ustawić domenę cookie i serwera w konfiguracji Flask, ale to też nie pomogło. – RJH

Odpowiedz

10

Okazuje się, że plik cookie wysyłany do klienta (Chrome) przekracza limit 4096 bajtów dla rozmiaru pliku cookie. Najwyraźniej Django domyślnie korzysta z sesji po stronie serwera, co sprawiło, że problem pojawił się tylko wtedy, gdy przeniosłem swój kod do Flask. Korzystanie z sesji po stronie serwera w Flask, takich jak w flask-kvsession i innych, powinno naprawić problem.

+1

... gdybym tylko natknąłem się na [to wcześniejsze pytanie] (http://stackoverflow.com/questions/7100315/flask-session-member-not-persisting-across-requests?rq=1). – RJH

+1

... To niewiarygodne, że nie otrzymujemy żadnego ostrzeżenia w czasie wykonywania. Wygląda na to, że oświadczenie jest po prostu ignorowane. Jestem pewien, że sygnalizowanie go w jakiś sposób pozwoliłoby zaoszczędzić wiele godzin na szukanie błędów. :) – filannim

Powiązane problemy