http.cookies --- HTTP quản lý nhà nước

Source code: Lib/http/cookies.py


Mô-đun http.cookies xác định các lớp để trừu tượng hóa khái niệm cookie, một cơ chế quản lý trạng thái HTTP. Nó hỗ trợ cả cookie chỉ chuỗi đơn giản và cung cấp tính trừu tượng để có bất kỳ loại dữ liệu có thể tuần tự hóa nào làm giá trị cookie.

Mô-đun này trước đây áp dụng nghiêm ngặt các quy tắc phân tích cú pháp được mô tả trong thông số kỹ thuật RFC 2109RFC 2068. Kể từ đó, người ta phát hiện ra rằng MSIE 3.0x đã không tuân theo các quy tắc ký tự được nêu trong các thông số kỹ thuật đó; nhiều trình duyệt và máy chủ hiện nay cũng đã nới lỏng các quy tắc phân tích cú pháp khi xử lý cookie. Kết quả là mô-đun này hiện sử dụng các quy tắc phân tích cú pháp ít nghiêm ngặt hơn trước đây một chút.

Bộ ký tự, string.ascii_letters, string.digits!#$%&'*+-.^_`|~: biểu thị tập hợp các ký tự hợp lệ được mô-đun này cho phép trong tên cookie (dưới dạng key).

Thay đổi trong phiên bản 3.3: Được phép ':' làm ký tự tên cookie hợp lệ.

Ghi chú

Khi gặp cookie không hợp lệ, CookieError sẽ được nâng lên, vì vậy nếu dữ liệu cookie của bạn đến từ trình duyệt, bạn phải luôn chuẩn bị cho dữ liệu không hợp lệ và phát hiện CookieError khi phân tích cú pháp.

exception http.cookies.CookieError

Ngoại lệ không thành công do RFC 2109 không hợp lệ: thuộc tính không chính xác, tiêu đề Set-Cookie không chính xác, v.v.

class http.cookies.BaseCookie([input])

Lớp này là một đối tượng giống như từ điển có khóa là chuỗi và có giá trị là các thể hiện Morsel. Lưu ý rằng khi đặt khóa thành giá trị, giá trị đầu tiên sẽ được chuyển đổi thành Morsel chứa khóa và giá trị.

Nếu input được đưa ra, nó sẽ được chuyển tới phương thức load().

class http.cookies.SimpleCookie([input])

Lớp này bắt nguồn từ BaseCookie và ghi đè value_decode()value_encode(). SimpleCookie hỗ trợ các chuỗi dưới dạng giá trị cookie. Khi đặt giá trị, SimpleCookie gọi str() dựng sẵn để chuyển đổi giá trị thành chuỗi. Các giá trị nhận được từ HTTP được giữ dưới dạng chuỗi.

Xem thêm

Mô-đun http.cookiejar

xử lý cookie HTTP cho web clients. Các mô-đun http.cookiejarhttp.cookies không phụ thuộc vào nhau.

RFC 2109 - HTTP Cơ chế quản lý nhà nước

Đây là đặc tả quản lý trạng thái được triển khai bởi mô-đun này.

Đồ vật nhỏ

class http.cookies.Morsel

Tóm tắt một cặp khóa/giá trị, có một số thuộc tính RFC 2109.

Morsels là các đối tượng giống như từ điển, có bộ khóa không đổi --- các thuộc tính RFC 2109 hợp lệ, đó là:

expires
path
comment
domain
max-age
secure
version
httponly
samesite
partitioned

Thuộc tính httponly chỉ định rằng cookie chỉ được truyền trong các yêu cầu HTTP và không thể truy cập được thông qua JavaScript. Điều này nhằm mục đích giảm thiểu một số hình thức kịch bản chéo trang.

Thuộc tính samesite kiểm soát thời điểm trình duyệt gửi cookie với các yêu cầu trên nhiều trang web. Điều này giúp giảm thiểu các cuộc tấn công CSRF. Các giá trị hợp lệ là "Nghiêm ngặt" (chỉ được gửi với các yêu cầu trên cùng một trang web), "Lỏng lẻo" (được gửi với các yêu cầu trên cùng một trang web và điều hướng cấp cao nhất) và "Không" (được gửi với các yêu cầu trên cùng một trang web và giữa các trang web). Khi sử dụng "Không", thuộc tính "bảo mật" cũng phải được đặt theo yêu cầu của các trình duyệt hiện đại.

Thuộc tính partitioned cho tác nhân người dùng biết rằng các cookie chéo trang should này chỉ khả dụng trong cùng ngữ cảnh cấp cao nhất mà cookie được đặt lần đầu tiên. Để tác nhân người dùng chấp nhận điều này, bạn must cũng đặt Secure.

Ngoài ra, bạn nên sử dụng tiền tố __Host khi đặt cookie được phân vùng để khiến chúng được liên kết với tên máy chủ chứ không phải miền có thể đăng ký. Đọc CHIPS (Cookies Having Independent Partitioned State) để biết đầy đủ chi tiết và ví dụ.

Các khóa không phân biệt chữ hoa chữ thường và giá trị mặc định của chúng là ''.

Thay đổi trong phiên bản 3.5: __eq__() hiện đã tính đến keyvalue.

Thay đổi trong phiên bản 3.7: Các thuộc tính key, valuecoded_value ở chế độ chỉ đọc. Sử dụng set() để cài đặt chúng.

Thay đổi trong phiên bản 3.8: Đã thêm hỗ trợ cho thuộc tính samesite.

Thay đổi trong phiên bản 3.14: Đã thêm hỗ trợ cho thuộc tính partitioned.

Morsel.value

Giá trị của cookie.

Morsel.coded_value

Giá trị được mã hóa của cookie --- đây là giá trị sẽ được gửi.

Morsel.key

Tên của bánh quy.

Morsel.set(key, value, coded_value)

Đặt thuộc tính key, valuecoded_value.

Morsel.isReservedKey(K)

Liệu K có phải là thành viên trong bộ chìa khóa của Morsel hay không.

Morsel.output(attrs=None, header='Set-Cookie:')

Trả về một chuỗi biểu diễn Morsel, phù hợp để gửi dưới dạng tiêu đề HTTP. Theo mặc định, tất cả các thuộc tính đều được bao gồm, trừ khi attrs được cung cấp, trong trường hợp đó nó phải là danh sách các thuộc tính sẽ sử dụng. header theo mặc định là "Set-Cookie:".

Morsel.js_output(attrs=None)

Trả về một đoạn mã JavaScript có thể nhúng, nếu chạy trên trình duyệt hỗ trợ JavaScript, đoạn mã này sẽ hoạt động giống như khi tiêu đề HTTP được gửi.

Ý nghĩa của attrs cũng giống như output().

Morsel.OutputString(attrs=None)

Trả về một chuỗi đại diện cho Morsel mà không có bất kỳ HTTP hoặc JavaScript nào xung quanh.

Ý nghĩa của attrs cũng giống như output().

Morsel.update(values)

Cập nhật các giá trị trong từ điển Morsel với các giá trị trong từ điển values. Phát sinh lỗi nếu bất kỳ khóa nào trong lệnh values không phải là thuộc tính RFC 2109 hợp lệ.

Thay đổi trong phiên bản 3.5: một lỗi được đưa ra đối với các khóa không hợp lệ.

Morsel.copy(value)

Trả về một bản sao nông của đối tượng Morsel.

Thay đổi trong phiên bản 3.5: trả về một đối tượng Morsel thay vì một lệnh.

Morsel.setdefault(key, value=None)

Phát sinh lỗi nếu khóa không phải là thuộc tính RFC 2109 hợp lệ, nếu không thì hoạt động giống như dict.setdefault().

Ví dụ

Ví dụ sau đây minh họa cách sử dụng mô-đun http.cookies.

>>> từ cookie nhập http
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["đường"] = "bánh xốp"
>>> in(C) tiêu đề # generate HTTP
Set-Cookie: fig=newton
Set-Cookie: đường=bánh xốp
>>> print(C.output()) điều # same
Set-Cookie: fig=newton
Set-Cookie: đường=bánh xốp
>>> C = cookies.SimpleCookie()
>>> C["đá"] = "đường"
>>> C["rocky"]["path"] = "/cookie"
>>> print(C.output(header="Cookie:"))
Bánh quy: đá=đường; Đường dẫn=/cookie
>>> print(C.output(attrs=[], header="Cookie:"))
Bánh quy: đá=con đường
>>> C = cookies.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # load từ một chuỗi (tiêu đề HTTP)
>>> in(C)
Set-Cookie: chip=ahoy
Set-Cookie: vienna=ngón tay
>>> C = cookies.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=;";')
>>> in(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=;"
>>> C = cookies.SimpleCookie()
>>> C["oreo"] = "thứ đôi"
>>> C["oreo"]["path"] = "/"
>>> in(C)
Set-Cookie: oreo=doublestuff; Đường dẫn=/
>>> C = cookies.SimpleCookie()
>>> C["twix"] = "không có gì cho bạn"
>>> C["twix"].giá trị
'không có gì cho bạn'
>>> C = cookies.SimpleCookie()
>>> C["số"] = 7 # equivalent đến C["số"] = str(7)
>>> C["chuỗi"] = "bảy"
>>> C["số"].giá trị
'7'
>>> C["chuỗi"].giá trị
'bảy'
>>> in(C)
Đặt-Cookie: số=7
Set-Cookie: string=seven