2012-12-07 25 views
8

Vì vậy, sự hiểu biết của tôi về buổi Flask là tôi có thể sử dụng nó như một cuốn từ điển và thêm giá trị cho một phiên bằng cách thực hiện:Tại sao một số giá trị phiên Flask biến mất khỏi phiên sau khi đóng cửa sổ trình duyệt, nhưng sau đó xuất hiện lại sau đó mà không cần thêm chúng?

phiên [ 'tên chủ chốt'] = 'một số giá trị ở đây'

Và đó công trình khỏe.

Trên tuyến đường, tôi có cuộc gọi của khách hàng sử dụng bài đăng AJAX, tôi chỉ định giá trị cho phiên. Và nó hoạt động tốt. Tôi có thể nhấp vào các trang khác nhau của trang web của tôi và giá trị nằm trong phiên. Tuy nhiên, nếu tôi đóng cửa sổ trình duyệt và sau đó quay trở lại trang web của tôi, giá trị phiên mà tôi đã có trong đó sẽ biến mất.

Điều đó thật lạ và bạn nghĩ rằng vấn đề là phiên không phải là vĩnh viễn. Tôi cũng đã triển khai Flask-Openid và sử dụng phiên để lưu trữ thông tin và rằng hiện vẫn tồn tại nếu tôi đóng cửa sổ trình duyệt và mở lại. Tôi cũng đã kiểm tra cookie sau khi đóng cửa sổ trình duyệt, nhưng trước khi quay lại trang web của tôi và cookie thực sự vẫn còn ở đó.

Một hành vi lạ khác (có thể liên quan) là một số giá trị tôi đã viết cho phiên cho mục đích thử nghiệm sẽ biến mất khi tôi truy cập tuyến đường bưu điện AJAX và gán giá trị chính xác. Vì vậy, đó là lẻ, nhưng những gì là thật kỳ lạ là khi tôi sau đó đóng cửa sổ trình duyệt và mở nó lên một lần nữa, và do đó bị mất giá trị tôi đã cố gắng giữ lại, những người mà tôi bị mất trước đó thực sự trở lại! Chúng không được gán lại vì không có mã trong các tệp Python của tôi để gán lại các giá trị đó.

Dưới đây là một số kết quả đầu ra cho trình trợ giúp làm cho nó rõ ràng hơn. Tất cả chúng đều được xuất ra từ một tuyến đường cho một trang thực, chứ không phải tuyến đường bưu điện AJAX mà tôi đã đề cập ở trên.

Đây là đầu ra sau khi tôi đã gán giá trị tôi muốn lưu trữ trong phiên. Khóa giá trị là 'userid' - tất cả các giá trị khác là các giá trị giả mà tôi đã thêm vào khi cố giải quyết vấn đề này. 'userid': 8 sẽ ở lại trong phiên miễn là tôi không đóng cửa sổ trình duyệt. Tôi có thể truy cập các tuyến đường khác và giá trị sẽ vẫn ở đó giống như vậy.

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>] 

Nếu tôi làm đóng cửa sổ trình duyệt, và quay trở lại trang web, nhưng mà không làm lại theo yêu cầu bài AJAX, tôi nhận được kết quả này:

['session.=', <SecureCookieSession {'adding using before request': 'hi', '_permanent': True, 'yo': 'yo'}>] 

Giá trị 'yo' không có trong đầu ra đầu tiên đầu tiên. Tôi không biết nó đến từ đâu. Tôi tìm kiếm mã của tôi cho 'yo' và không có trường hợp nào của tôi gán giá trị đó ở bất kỳ đâu. Tôi nghĩ rằng tôi có thể đã thêm nó vào phiên ngày trước. Vì vậy, nó có vẻ như nó là bền bỉ, nhưng bị ẩn khi các giá trị khác được viết.

Và điều cuối cùng này là tôi truy cập lại tuyến đường bưu điện AJAX và sau đó chuyển đến trang in ra các phím bằng cách sử dụng gỡ lỗi. Cùng công suất, chế độ xuất ra đầu tiên tôi dán ở trên, mà bạn mong đợi, và giá trị 'yo' đã biến mất một lần nữa (nhưng nó sẽ quay trở lại nếu tôi đóng cửa sổ trình duyệt)

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>] 

Tôi đã thử nghiệm này trong cả Chrome và Firefox.

Vì vậy, tôi thấy điều này tất cả kỳ lạ và tôi đoán nó bắt nguồn từ một sự hiểu lầm về cách phiên làm việc. Tôi nghĩ rằng đó là từ điển và tôi có thể viết các giá trị từ điển vào chúng và lấy lại chúng sau này miễn là tôi đặt phiên thành vĩnh viễn và cookie không bị xóa.

Bất kỳ ý tưởng nào tại sao hành vi kỳ lạ này đang xảy ra?

Trả lời

12

Hóa ra sự cố là một cookie đa miền. Tôi đang chạy trang web cục bộ tại 127.0.0.1 charm000 nhưng đôi khi trang web được truy cập tại localhost: 5000 - vì vậy mỗi tên miền đó đều có một cookie riêng biệt. Điều này giải thích tại sao dữ liệu đã biến mất và sau đó lại xuất hiện. Nó chỉ được liên kết với các tên miền khác nhau.

Dưới đây là chỉ thêm chi tiết

này đã về vì Facebook không muốn địa chỉ IP cho tên miền. Vì vậy, khi phát triển cục bộ, tôi đã sử dụng 127.0.0.1 charm000 nhưng url gọi lại của Facebook là localhost: 5000. Mà hoạt động tốt vì Flask chọn lên yêu cầu ở cả hai url và xử lý chúng như nhau - tất cả các tuyến đường làm việc như mong đợi. Ngoại trừ cookie phiên được liên kết với các url khác nhau.

5

Phiên làm sạch sẽ bị xóa khi bạn đóng trình duyệt NẾU bạn chưa đặt session.permanent = True. Đó là cách các phiên bình được định nghĩa và được đề cập trong tài liệu.

Nếu bạn đặt phiên làm thường trú, thì mặc định là 31 ngày khi phiên sẽ tiếp tục tồn tại. Bạn cũng có thể thay đổi mặc định đó theo session.permanent_session_lifetime. Điều này có nghĩa là phiên sẽ vẫn tồn tại ngay cả khi bạn đóng trình duyệt trừ khi tất nhiên, bạn tự xóa cookie theo cách thủ công.

Trong trường hợp của bạn, tôi không chắc chắn cách bạn đang sử dụng các cuộc gọi AJAX nhưng nói chung, điều trên phải giữ đúng về các phiên bình định mặc định.

Các vấn đề liên quan