2010-10-20 31 views
21

Theo tài liệu Django, "nếu SESSION_EXPIRE_AT_BROWSER_CLOSE được đặt thành True, Django sẽ sử dụng cookie có độ dài trình duyệt - cookie hết hạn ngay khi người dùng đóng trình duyệt của họ. Hãy sử dụng điều này nếu bạn muốn mọi người phải đăng nhập mọi thời gian họ mở trình duyệt. "Tại sao không SESSION_EXPIRE_AT_BROWSER_CLOSE = True đăng nhập người dùng khi trình duyệt bị đóng?

Và đó là những gì tôi đã làm bằng cách thêm dòng sau vào tập tin settings.py của tôi (và khởi động lại máy chủ):

# Close the session when user closes the browser 
SESSION_EXPIRE_AT_BROWSER_CLOSE = True 

Sau đó, tôi đăng nhập vào một trang mà kiểm tra nếu người dùng được xác thực, và sau đó tôi đóng trình duyệt. Khi tôi mở lại trình duyệt và truy cập vào cùng một trang, nó không yêu cầu tên người dùng và mật khẩu vì nó vượt qua bài kiểm tra sau đây:

def check_teacher(request): 
    result = {} 
    if request.user.is_authenticated(): 
     ... 

Tôi đang làm gì sai hoặc thiếu gì? Bất kỳ đề xuất?

Tôi đang sử dụng phiên bản Django 1.3 pre-alpha SVN-13858 trên hệ thống Ubuntu GNU/Linux 10.10 của mình và chạy ví dụ trên bằng máy chủ phát triển Django.

+1

Có thể bạn đã có một cookie lâu dài được lưu trữ trong trình duyệt của bạn từ trước khi bạn thay đổi nó thành một phiên. Thử xóa cookie của bạn. –

+0

Nó hoạt động nhưng chỉ một lần: (Tôi đã xóa cookie và đăng nhập hoạt động trong Firefox của mình (sử dụng Công cụ -> Xóa Lịch sử Gần đây), sau đó đóng trình duyệt và khi tôi cố truy cập lại trang yêu cầu tên người dùng và mật khẩu. sau đó đóng trình duyệt, sau đó mở lại, truy cập vào cùng một trang nhưng lần này nó không hỏi lại. Tôi đã đóng và mở lại một vài lần và tiếc là nó không bao giờ đăng nhập lại cho tôi một lần nữa –

Trả lời

19

Đóng tab hoặc cửa sổ không được tính là đóng trình duyệt. Đảm bảo bạn thoát chương trình trình duyệt để kết thúc phiên trình duyệt.

Nếu điều đó không hiệu quả, hãy sử dụng FireBug trong firefox hoặc Trình kiểm tra web trong Safari để kiểm tra kỹ các tiêu đề trong phản hồi trên lần truy cập trang đầu tiên của bạn. Lần truy cập trang đầu tiên có thể là một trong nhiều thứ; khi bạn mở trình duyệt lần đầu tiên, khi bạn đăng xuất hoặc ngay lập tức sau khi xóa cookie. Với SESSION_EXPIRE_AT_BROWSER_CLOSE = True bạn sẽ thấy một cái gì đó như thế này trong các tiêu đề:

Set-Cookie:sessionid=f4c06139bc46a10e1a30d5f0ab7773e2; Path=/ 

Và khi SESSION_EXPIRE_AT_BROWSER_CLOSE = False một giá trị expires=... sẽ được thêm vào:

Set-Cookie:sessionid=a532f3d7dc314afc58e8f676ed72280e; expires=Wed, 03-Nov-2010 17:08:45 GMT; Max-Age=1209600; Path=/ 

Nếu bạn có một thời gian khó nhìn thấy những Set-Cookie tiêu đề vì chuyển hướng bạn có thể thử sử dụng django-debug-toolbar để chia nhỏ chuyển hướng thành nhiều trang.

+0

Tình huống có một chút rõ ràng tôi bây giờ: Khi tôi giữ tab bao gồm ứng dụng Django của tôi mở và yêu cầu Firefox "lưu tab và cửa sổ của tôi trong lần tiếp theo", sau đó đóng và khởi động lại Firefox, tab đó cũng được mở và tôi có thể Tuy nhiên nếu tôi đóng tab đó, sau đó thoát khỏi Firefox (và một lần nữa nói với nó để lưu các tab của tôi), lại bắt đầu và mở một tab mới, hãy truy cập trang của ứng dụng sau đó tôi buộc để đăng nhập. –

+1

Tôi chưa bao giờ xem xét hành vi tiết kiệm thời gian tiếp theo của FF nhưng có vẻ như nó có thể lưu trữ cookie trên các phiên bản trình duyệt. Kiểm tra kỹ các tiêu đề bạn đang gửi giữa mỗi thể hiện của FF. Tôi sẽ không lo lắng quá nhiều. Nếu bạn vẫn còn tò mò, có một số cuộc thảo luận về cookie trên trang này cho thấy rằng FF có thể lưu trữ tất cả các cookie: https://wiki.mozilla.org/Session_Restore – istruble

+0

Có, có vẻ như để lưu trữ chúng (tôi không thể tìm thấy bất kỳ giải thích khác cho hành vi tôi mô tả trong bình luận của tôi ở trên). –

1

Thay đổi sẽ không áp dụng trừ khi bạn chạy lại manage.py syncdb.

0

Bạn cần phải dọn dẹp các phiên trong DB:

delete FROM django_session 
+2

Tôi nghĩ bạn không cần 'nơi 1 = 1' để xóa tất cả các hàng,' xóa FROM django_session' là đủ. –

4

@istruble và @haasfsafas đều đúng. Giải pháp là để

  1. Set SESSION_EXPIRE_AT_BROWSER_CLOSE = True
  2. Xóa các hàng trong bảng django_session để xóa ra bất kỳ phiên mà có thể gây nhầm lẫn. (delete from django_session)
  3. Nhận biết rằng tất cả các cửa sổ và tab trong trình duyệt của bạn phải được đóng để phiên hết hạn. Đó là hành vi của trình duyệt; không phải là hành vi Django.
Các vấn đề liên quan