Người dùng có thể truy cập dữ liệu phiên không?

Hướng dẫn này mở rộng trang web LocalLibrary của chúng tôi, thêm bộ đếm lượt truy cập dựa trên phiên vào trang chủ. Đây là một ví dụ tương đối đơn giản, nhưng nó cho thấy cách bạn có thể sử dụng khung phiên để cung cấp hành vi liên tục cho người dùng ẩn danh trong trang web của riêng bạn

điều kiện tiên quyết. Hoàn thành tất cả các chủ đề hướng dẫn trước đó, bao gồm Hướng dẫn Django Phần 6. Danh sách chung và chế độ xem chi tiếtKhách quan. Để hiểu cách phiên được sử dụng

Trang web LocalLibrary mà chúng tôi đã tạo trong các hướng dẫn trước cho phép người dùng duyệt sách và tác giả trong danh mục. Mặc dù nội dung được tạo động từ cơ sở dữ liệu, nhưng về cơ bản, mọi người dùng sẽ có quyền truy cập vào các trang và loại thông tin giống nhau khi họ sử dụng trang web

Trong thư viện "thực", bạn có thể muốn cung cấp cho người dùng cá nhân trải nghiệm tùy chỉnh, dựa trên việc họ sử dụng trang web trước đây, tùy chọn, v.v. Ví dụ: bạn có thể ẩn thông báo cảnh báo mà người dùng đã xác nhận trước đó vào lần tới khi họ truy cập trang web hoặc lưu trữ và tôn trọng tùy chọn của họ (chẳng hạn như số lượng kết quả tìm kiếm mà họ muốn hiển thị trên mỗi trang)

Khung phiên cho phép bạn triển khai loại hành vi này, cho phép bạn lưu trữ và truy xuất dữ liệu tùy ý trên cơ sở từng khách truy cập trang web

Tất cả giao tiếp giữa trình duyệt web và máy chủ đều thông qua HTTP, không trạng thái. Thực tế là giao thức không trạng thái có nghĩa là các thông báo giữa máy khách và máy chủ hoàn toàn độc lập với nhau — không có khái niệm về "trình tự" hoặc hành vi dựa trên các thông báo trước đó. Do đó, nếu bạn muốn có một trang web theo dõi các mối quan hệ đang diễn ra với khách hàng, bạn cần phải tự triển khai điều đó

Phiên là cơ chế được Django (và hầu hết Internet) sử dụng để theo dõi "trạng thái" giữa trang web và một trình duyệt cụ thể. Phiên cho phép bạn lưu trữ dữ liệu tùy ý trên mỗi trình duyệt và cung cấp dữ liệu này cho trang web bất cứ khi nào trình duyệt kết nối. Các mục dữ liệu riêng lẻ được liên kết với phiên sau đó được tham chiếu bằng một "khóa", được sử dụng để lưu trữ và truy xuất dữ liệu

Django sử dụng cookie chứa id phiên đặc biệt để xác định từng trình duyệt và phiên được liên kết với trang web. Dữ liệu phiên thực tế được lưu trữ trong cơ sở dữ liệu trang web theo mặc định (điều này an toàn hơn lưu trữ dữ liệu trong cookie, nơi chúng dễ bị người dùng độc hại tấn công hơn). Bạn có thể định cấu hình Django để lưu trữ dữ liệu phiên ở những nơi khác (bộ đệm, tệp, cookie "an toàn"), nhưng vị trí mặc định là một tùy chọn tốt và tương đối an toàn

Các phiên được bật tự động khi chúng tôi tạo trang web khung (trong hướng dẫn 2)

Cấu hình được thiết lập trong phần

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
7 và
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
8 của tệp dự án (locallibrary/locallibrary/settings. py), như hình bên dưới

INSTALLED_APPS = [
    # …
    'django.contrib.sessions',
    # …

MIDDLEWARE = [
    # …
    'django.contrib.sessions.middleware.SessionMiddleware',
    # …

Bạn có thể truy cập thuộc tính

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
9 trong chế độ xem từ tham số
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
0 (một
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
0 được chuyển vào làm đối số đầu tiên cho chế độ xem). Thuộc tính phiên này biểu thị kết nối cụ thể với người dùng hiện tại (hay chính xác hơn là kết nối với trình duyệt hiện tại, như được xác định bởi id phiên trong cookie của trình duyệt cho trang web này)

Thuộc tính

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
9 là một đối tượng giống như từ điển mà bạn có thể đọc và viết bao nhiêu lần tùy thích trong chế độ xem của mình, sửa đổi nó theo ý muốn. Bạn có thể thực hiện tất cả các thao tác từ điển thông thường, bao gồm xóa tất cả dữ liệu, kiểm tra xem có khóa hay không, lặp qua dữ liệu, v.v. Tuy nhiên, hầu hết thời gian, bạn sẽ chỉ sử dụng API "từ điển" tiêu chuẩn để nhận và đặt giá trị

Các đoạn mã bên dưới cho biết cách bạn có thể lấy, đặt và xóa một số dữ liệu bằng khóa "

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
2", được liên kết với phiên hiện tại (trình duyệt)

Ghi chú. Một trong những điều tuyệt vời về Django là bạn không cần phải suy nghĩ về các cơ chế liên kết phiên với yêu cầu hiện tại của bạn trong chế độ xem của bạn. Nếu chúng tôi sử dụng các đoạn bên dưới theo quan điểm của mình, chúng tôi sẽ biết rằng thông tin về

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
2 chỉ được liên kết với trình duyệt đã gửi yêu cầu hiện tại

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']

API cũng cung cấp một số phương pháp khác chủ yếu được sử dụng để quản lý cookie phiên được liên kết. Ví dụ: có các phương pháp để kiểm tra xem cookie có được hỗ trợ trong trình duyệt máy khách hay không, để đặt và kiểm tra ngày hết hạn của cookie cũng như xóa các phiên đã hết hạn khỏi kho lưu trữ dữ liệu. Bạn có thể tìm hiểu về API đầy đủ trong Cách sử dụng phiên (tài liệu Django)

Theo mặc định, Django chỉ lưu vào cơ sở dữ liệu phiên và gửi cookie phiên cho máy khách khi phiên đã được sửa đổi (chỉ định) hoặc bị xóa. Nếu bạn đang cập nhật một số dữ liệu bằng khóa phiên của nó như đã trình bày trong phần trước, thì bạn không cần phải lo lắng về điều này. Ví dụ

# This is detected as an update to the session, so session data is saved.
request.session['my_car'] = 'mini'

Nếu bạn đang cập nhật một số thông tin trong dữ liệu phiên, thì Django sẽ không nhận ra rằng bạn đã thực hiện thay đổi đối với phiên và lưu dữ liệu (ví dụ: nếu bạn thay đổi dữ liệu "

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
4" bên trong dữ liệu "
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
2" của mình, . Trong trường hợp này, bạn sẽ cần đánh dấu rõ ràng phiên là đã được sửa đổi

________số 8

Ghi chú. Bạn có thể thay đổi hành vi để trang web sẽ cập nhật cơ sở dữ liệu/gửi cookie theo mọi yêu cầu bằng cách thêm

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
6 vào cài đặt dự án của bạn (locallibrary/locallibrary/settings. py)

Như một ví dụ thực tế đơn giản, chúng tôi sẽ cập nhật thư viện của mình để cho người dùng hiện tại biết họ đã truy cập trang chủ LocalLibrary bao nhiêu lần

Mở /locallibrary/catalog/views. py và thêm các dòng chứa

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
7 vào
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
8 (như hình bên dưới)

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
2

Ở đây, trước tiên chúng tôi lấy giá trị của khóa phiên

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
9, đặt giá trị thành 0 nếu trước đó chưa được đặt. Mỗi khi nhận được yêu cầu, chúng tôi sẽ tăng giá trị và lưu trữ lại trong phiên (cho lần tiếp theo người dùng truy cập trang). Biến
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
7 sau đó được chuyển đến mẫu trong biến ngữ cảnh của chúng tôi

Ghi chú. Chúng tôi cũng có thể kiểm tra xem cookie có được hỗ trợ trong trình duyệt tại đây hay không (xem Cách sử dụng phiên để biết ví dụ) hoặc thiết kế giao diện người dùng của chúng tôi sao cho việc cookie có được hỗ trợ hay không không quan trọng

Thêm dòng hiển thị ở cuối khối sau vào mẫu HTML chính của bạn (/locallibrary/catalog/templates/index. html) ở cuối phần "Nội dung động" để hiển thị biến ngữ cảnh

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
7

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']
6

Lưu ý rằng chúng tôi sử dụng thẻ mẫu tích hợp Django để thêm "s" khi trang đã được truy cập nhiều lần

Lưu các thay đổi của bạn và khởi động lại máy chủ thử nghiệm. Mỗi khi bạn làm mới trang, số sẽ cập nhật

Giờ đây, bạn đã biết việc sử dụng phiên để cải thiện tương tác của mình với người dùng ẩn danh dễ dàng như thế nào

Trong các bài viết tiếp theo, chúng tôi sẽ giải thích về khung xác thực và ủy quyền (quyền), đồng thời chỉ cho bạn cách hỗ trợ tài khoản người dùng

Khách hàng có thể truy cập các biến phiên không?

Các biến phiên có thể được truy cập ở phía máy khách . Ví dụ: bạn có thể kiểm tra giá trị bằng cách gọi. cảnh báo('

Người dùng có thể chỉnh sửa bộ nhớ phiên không?

Thông tin phiên được lưu trữ trên máy chủ. Điều đó có nghĩa là người dùng không thể thay đổi nó .

Người dùng có thể chỉnh sửa các biến phiên không?

Các biến phiên trên máy khách ở dạng chỉ đọc. Không thể sửa đổi chúng .

Phiên có được chia sẻ giữa những người dùng không?

Không, nó không được chia sẻ .