Trong Django, làm cách nào tôi có thể tìm ra sessionid request.session và sử dụng nó như một biến?


88

Tôi biết rằng bạn có thể lấy các biến phiên bằng cách sử dụng request.session['variable_name'], nhưng dường như không có cách nào để lấy sessionid làm một biến theo cách tương tự. Điều này có được ghi lại ở bất cứ đâu không? Tôi không thể tìm thấy nó. Cảm ơn bạn đã giúp đỡ!

Câu trả lời:


142

Đơn giản hơn nhiều:

request.session.session_key

Lưu ý khóa sẽ chỉ tồn tại nếu có phiên, không có khóa, không có phiên. Bạn có thể sử dụng điều này để kiểm tra xem phiên có tồn tại hay không. Nếu bạn muốn tạo một phiên, hãy gọi tạo.


3
@VebjornLjosa làm gì?
aehlke

3
@aehike: request.session._session_keytheo câu trả lời từ @Vinicius
hughes

3
request.session.session_keyhoạt động tốt trong Django 1.6.
ecstaticpeon

9
request.session.session_keycũng hoạt động tốt trong Django 1.7.
Andrew E

3
Tôi thích sử dụng hơn request.session._get_or_create_session_key()vì có thể xảy ra trường hợp chưa có ID.
patroqueeet

24

Phiên Django lưu khóa của họ trong cookie. Ít nhất phần mềm trung gian của nó trích xuất nó như thế này:

from django.conf import settings
session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]

1
Điều này không hữu ích nếu khóa phiên không tồn tại.
Greg

19

trong Django> = 1.4 sử dụng:

request.session._session_key

9
Erm, mục đích chính của các biến private (những biến bắt đầu bằng dấu gạch dưới) là bạn không nên sử dụng chúng.
Michał Górny,

1
@ MichałGórny vậy giải pháp thay thế là gì? nếu không có, tôi không hiểu chúng ta có sự lựa chọn như thế nào ...
Đánh dấu

1
Cách thay thế là viết mã thích hợp. Nếu django không cung cấp API công khai để lấy khóa phiên, điều đó đơn giản có nghĩa là bạn không được phép sử dụng khóa đó. Tôi không thể cho bạn biết thêm nếu không biết chính xác bạn đang cố gắng làm gì nhưng có lẽ đó là một lĩnh vực cho câu hỏi riêng biệt.
Michał Górny

12

Điều này sẽ giúp bạn nhận được ID phiên hoặc tạo một ID phiên cho bạn. Nếu bạn làm vậy dir(request.session), bạn sẽ nhận được nhiều phương pháp hữu ích.

['TEST_COOKIE_NAME', 'TEST_COOKIE_VALUE', '__class__', '__contains__',
'__delattr__', '__delitem__', '__dict__', '__doc__', '__format__',
'__getattribute__', '__getitem__', '__hash__', '__init__', '__module__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'_get_new_session_key', '_get_or_create_session_key', '_get_session',
'_get_session_key', '_hash', '_session', '_session_key', 'accessed',
'clear', 'create', 'cycle_key', 'decode', 'delete', 'delete_test_cookie',
'encode', 'exists', 'flush', 'get', 'get_expire_at_browser_close',
'get_expiry_age', 'get_expiry_date', 'has_key', 'items', 'iteritems',
'iterkeys', 'itervalues', 'keys', 'load', 'modified', 'pop', 'save',
'session_key', 'set_expiry', 'set_test_cookie', 'setdefault',
'test_cookie_worked', 'update', 'values']


session_id = request.session._get_or_create_session_key()


6

Để nhận khóa phiên một cách đáng tin cậy, trước tiên bạn cần đảm bảo rằng phiên đã được tạo. Tài liệu đề cập đến .create()phương thức phiên, có thể được sử dụng để đảm bảo có khóa phiên:

def my_view(request):
    if not request.session.session_key:
        request.session.create()

    print(request.session.session_key)

3

Trong Django 1.8:

request.session.session_key


request.session._session_key

Cả hai đều hoạt động chính xác.


-1

Bạn cũng có thể kiểm tra các phiên của mình :

If "var" in request.session:
       Var = request.session['var']
        Return httpResponse("set")
Else:
       Return httpResponse("there isn't")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.