2013-04-17 35 views
8

Tôi sử dụng auth django cho trang web của mình, cần phải cài đặt phiên bản trung gian của phiên.Vô hiệu hóa cookie người dùng ẩn danh với Django

Phần mềm trung gian phiên Django luôn thêm cookie phiên, ngay cả đối với người dùng ẩn danh (người dùng không được xác thực). Khi họ xác thực cookie được thay thế bằng một số khác cho biết người dùng đã đăng nhập.

Tôi muốn tắt cookie người dùng ẩn danh cho mục đích lưu vào bộ nhớ cache (véc ni).

Có cách nào để tắt cookie người dùng ẩn danh mà không xóa phần mềm trung gian phiên cần thiết cho ứng dụng sử dụng auth không?

+0

Phiên không được tạo nếu bạn không truy cập hoặc sửa đổi nó trong mã của bạn. – sbaechler

Trả lời

7

Dữ liệu phiên được đặt trong cookie trong số process_response của SessionMiddleware. Hàm này không sử dụng bất kỳ cài đặt nào hoặc request.user, vì vậy bạn không có bất kỳ cách nào để biết bên trong phương thức này cho dù người dùng là người dùng đã đăng nhập hay người dùng ẩn danh. Vì vậy, bạn không thể vô hiệu hóa việc gửi cookie phiên tới trình duyệt.

Tuy nhiên nếu bạn muốn chức năng này thì bạn có thể phân lớp SessionMiddleware và ghi đè process_response.

from django.contrib.sessions.middleware import SessionMiddleware 
from django.conf import settings 

class NewSessionMiddleware(SessionMiddleware): 

    def process_response(self, request, response): 
     response = super(NewSessionMiddleware, self).process_response(request, response) 
     #You have access to request.user in this method 
     if not request.user.is_authenticated(): 
      del response.cookies[settings.SESSION_COOKIE_NAME] 
     return response 

Và bạn có thể sử dụng NewSessionMiddleware thay cho SessionMiddleware.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'myapp.middleware.NewSessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.doc.XViewMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
) 
+0

Tôi nghĩ về subclassing nhưng là request.user.is_authenticated() nhấn db cho loại kiểm tra? Nếu có điều này có nghĩa là nó sẽ nhấn DB mỗi khi một trang được tải? – kollo

+0

Không 'is_authenticated()' không nhấn db. Populating 'request.user' truy cập db và nó được thực hiện bởi AuthenticationMiddleware. Nhưng điều này bạn anyways muốn xảy ra trên tất cả các yêu cầu. Nhưng 'is_authenticated' chỉ trả về True hoặc False tùy thuộc vào người dùng, cụ thể nếu' request.user' là một thể hiện của 'User', nó sẽ trả về True và nếu' request.user' là một cá thể của 'AnonymousUser' , nó sẽ trả về Sai. Nhưng nó sẽ không nhấn db. –

+0

Ok cảm ơn, tôi sẽ đào sâu vào điều này;) – kollo

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