2009-09-02 45 views
12

Từ tài liệu django, tôi trở nên ấn tượng rằng cách gọi:Phiên Django hết hạn?

request.session.set_expiry(300) 

từ một quan điểm sẽ gây ra phiên sắp hết hạn sau năm phút không hoạt động; Tuy nhiên, đây không phải là hành vi mà tôi đang gặp trong thân cây django. Nếu tôi gọi phương thức này từ một chế độ xem và duyệt qua các chế độ xem khác không gọi phương thức, phiên sẽ hết hạn sau năm phút. Các hành vi mà tôi đã mong đợi là hết hạn chỉ sau năm phút không hoạt động và không chỉ đơn giản là không gọi set_expiry một lần nữa trước khi hết hạn.

Câu hỏi của tôi sau đó là tôi có thực sự cần gọi set_expiry trong mọi chế độ xem không? Nếu vậy, có tồn tại một số trang trí có thể được hỗ trợ? Tôi không thể tưởng tượng điều này không phải là một phần của sự đóng góp.

Cảm ơn, Pete

Trả lời

26

Là tác giả của các phương pháp đó, tôi có thể thấy rằng các tài liệu không phải là rất rõ ràng về vấn đề này. Quan sát của bạn là chính xác: chỉ những yêu cầu khiến phiên bị thay đổi mới được coi là "hoạt động".

Bạn có thể sử dụng cài đặt SESSION_SAVE_EVERY_REQUEST để nhận hành vi bạn đang theo dõi (với chi phí rõ ràng của phiên phải được lưu mọi yêu cầu).

+0

Cảm ơn Chris, điều đó đã xảy ra. Thông tin mà bạn vừa cung cấp sẽ được đưa vào tài liệu. – slypete

+1

Đồng ý. Chăm sóc để mở một vé? ;) – SmileyChris

3

Một phần mềm trung gian đơn giản có thể sẽ hoạt động tốt hơn thiết lập này trong mỗi chế độ xem. Đây là những gì tôi đã sử dụng.

class SessionExpiry(object): 
    """ Set the session expiry according to settings """ 
    def process_request(self, request): 
     if getattr(settings, 'SESSION_EXPIRY', None): 
      request.session.set_expiry(settings.SESSION_EXPIRY) 
     return None 

này phụ thuộc vào SESSION_EXPIRY được thiết lập trong cấu hình của bạn. Định dạng của nó giống với request.session.set_expiry.

MIDDLEWARE_CLASSES nên được định nghĩa với lệnh này trong tâm trí:

MIDDLEWARE_CLASSES = (
    ... 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    '<yourproject>.<yourapp>.middleware.SessionExpiry', 
    ... 
} 

Nó muốn được tốt đẹp nếu django.contrib.sessions mất thiết lập này vào tài khoản theo mặc định.

+0

Bạn đã bỏ lỡ câu trả lời của SmileyChris? 'SESSION_SAVE_EVERY_REQUEST' thực hiện chính xác điều này mà không cần bất kỳ phần mềm trung gian tùy chỉnh nào. – slypete

+1

Có, nhưng chỉ có set_expiry được gọi trong một chế độ xem yêu cầu tất cả người dùng của bạn phải nhấn vào (các) chế độ xem cụ thể đã đặt hết hạn. Có thể người dùng của bạn sẽ không thông qua chế độ xem cụ thể này. Với phần mềm trung gian, bạn có thể tóm tắt tập hợp hết hạn này bên ngoài chế độ xem. Nếu câu trả lời của anh ấy phù hợp với bạn, tuyệt vời. Tôi chỉ nghĩ rằng đây có thể là một cách làm sạch hơn và đó là cách tôi chọn để đi về nó. –

+0

Tôi nghĩ bạn hiểu sai câu trả lời. 'SESSION_SAVE_EVERY_REQUEST' thực hiện chính xác những gì bạn đang làm mà không có bất kỳ mã cụ thể nào. Tôi chỉ đang chỉ ra rằng bạn đã sáng chế lại bánh xe. – slypete

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