2013-04-16 28 views

Trả lời

13

Trong Django 1.8, mọi lệnh gọi flush() sẽ đăng xuất người dùng. Từ docs:

Changed in Django 1.8: Deletion of the session cookie is a behavior new in Django 1.8. Previously, the behavior was to regenerate the session key value that was sent back to the user in the cookie.

Nếu bạn muốn để có thể xóa các phím nhưng giữ người dùng đăng nhập, bạn sẽ cần phải xử lý nó bằng tay:

for key in request.session.keys(): 
    del request.session[key] 

Hoặc chỉ cần xóa các phím cụ thể là mối quan tâm:

del request.session['mykey'] 
+5

Tôi gặp lỗi: đối với khóa trong request.session.keys(): RuntimeError: kích thước thay đổi từ điển trong khi lặp lại. Sửa dưới đây. – AdamG

1

request.session sử dụng cookie nội bộ. Và khi người dùng yêu cầu một số url của trang web, chỉ các cookie hiện diện trên máy của người dùng đó được gửi đến máy chủ. Vì vậy, request.session luôn gắn với người dùng hiện tại.

Vì vậy, điều này sẽ không ảnh hưởng đến người dùng khác của trang web.

Ngoài ra điều này sẽ không đăng xuất người dùng hiện tại, vì bạn đang sử dụng flush() sẽ xóa phiên cũ và tạo phiên mới và phiên mới này sẽ được liên kết với người dùng hiện tại.

flush() sử dụng nội bộ clear(), delete()create().

Trong phản hồi, khóa phiên mới này sẽ được gửi dưới dạng cookie và trong các yêu cầu tiếp theo, phiên mới này sẽ tiếp tục hoạt động bình thường.

+0

Vậy tại sao đăng xuất khi tôi gọi request.session.flush() – Siecje

11

Trong phiên bản django < 1.8, session.flush xóa dữ liệu phiên và tạo lại khóa phiên. Nó sẽ không ảnh hưởng đến người dùng khác vì khóa phiên là duy nhất.

+0

chỉ có trong django 1.8 +? – aRkadeFR

+3

nó đã ở đó kể từ ít nhất 1.3 – Ngenator

+0

không hiểu tại sao tôi không thấy các phương thức trên đối tượng Phiên trong bảng điều khiển? Tôi đang tìm nạp nó thông qua Session.objects.get (session_key = ...) – aRkadeFR

1
session_keys = list(request.session.keys()) 
    for key in session_keys: 
     del request.session[key] 
3

Như một sự cải tiến để shacker của 1 bằng Python 2 .x dict.keys() trả về một bản sao danh sách các khóa của một từ điển, trong Python 3.x nó thay vì trả về một trình lặp. thay đổi kích thước của một iterator là không khôn ngoan. Đối với một phiên bản thực hiện an toàn đúc vào danh sách sẽ ngăn chặn bất kỳ kích thước hành

for key in list(request.session.keys()): 
    del request.session[key] 

câu trả lời trước của tôi đề nghị việc sử dụng dict.viewkeys() nhưng nó cũng sẽ trả về một iterator trong python 3.x.

0

Bạn có thể xóa các khóa bạn đã đặt trong phiên django, nhưng để làm như vậy mà không cần đăng nhập, người dùng sẽ mất một chút phức tạp; request.session.flush() ghi nhật ký người dùng ra. Và request.session = {} trong việc xóa tất cả các khóa trong từ điển phiên cũng sẽ đăng xuất người dùng.

Vì vậy, để xóa các phím mà không cần đăng xuất người dùng, bạn phải tránh các phím bắt đầu bằng ký tự gạch dưới. Đoạn mã sau thực hiện thủ thuật:

for key in list(request.session.keys()): 
    if not key.startswith("_"): # skip keys set by the django system 
    del request.session[key] 
Các vấn đề liên quan