Python yêu cầu phiên trust_env

# -*- mã hóa. utf-8 -*-"""yêu cầu. phiên ~~~~~~~~~~~~~~~~ Mô-đun này cung cấp đối tượng Phiên để quản lý và duy trì cài đặt trên các yêu cầu [cookie, xác thực, proxy]. """nhập bộ sưu tập osfrom nhập Ánh xạ từ ngày giờ nhập ngày giờ từ. nhập xác thực _basic_auth_strfrom. tương thích nhập cookielib, OrderedDict, urljoin, urlparse, dựng sẵn_strfrom. nhập cookie [ cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies]từ. mô hình nhập Yêu cầu, Yêu cầu đã chuẩn bị, DEFAULT_REDIRECT_LIMITtừ. móc nhập default_hooks, công văn_hookfrom. sử dụng nhập to_key_val_list, default_headers, to_native_stringfrom. nhập ngoại lệ [ TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError] từ. cấu trúc nhập CaseInsensitiveDictfrom. bộ điều hợp nhập HTTPAdapterfrom. nhập utils [ requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, get_auth_from_url]từ. status_codes mã nhập khẩu# được xác định trước đây tại đây, được hiển thị lại tại đây để tương thích ngượctừ. mô hình nhập REDIRECT_STATIdef merge_setting[request_setting, session_setting, dict_class=OrderedDict]. """ Xác định cài đặt phù hợp cho một yêu cầu nhất định, có tính đến cài đặt rõ ràng cho yêu cầu đó và cài đặt trong phiên. Nếu một cài đặt là một từ điển, chúng sẽ được hợp nhất với nhau bằng cách sử dụng `dict_class` """ nếu session_setting là Không có. trả lại request_setting nếu request_setting là Không có. return session_setting # Bỏ qua nếu không phải từ điển [e. g. verify] nếu không [ isinstance[session_setting, Mapping] và isinstance[request_setting, Mapping] ]. trả về request_settingmerged_setting = dict_class[to_key_val_list[session_setting]]merged_setting. update[to_key_val_list[request_setting]] # Xóa các khóa được đặt thành Không có. cho [k, v] trong request_setting. mặt hàng[]. nếu v là Không có. delmerged_setting[k]merged_setting=dict[[k,v] for [k,v] inmerged_setting. items[] nếu v không phải là Không] trả về merge_settingdef merge_hooks[request_hooks, session_hooks, dict_class=OrderedDict]. """ Hợp nhất đúng cách cả yêu cầu và móc phiên. Điều này là cần thiết vì khi request_hooks == {'response'. []}, quá trình hợp nhất sẽ phá vỡ hoàn toàn Móc phiên. """ nếu session_hooks là Không có hoặc session_hooks. nhận ['phản hồi'] == []. trả lại request_hooks nếu request_hooks là Không có hoặc request_hooks. nhận ['phản hồi'] == []. trả về session_hooks trả về merge_setting[request_hooks, session_hooks, dict_class] lớp SessionRedirectMixin[đối tượng]. def resolve_redirects[self, resp, req, stream=False, timeout=None, verify=True, cert=None, proxy=None]. """Nhận phản hồi. Trả về một trình tạo Phản hồi. """ i = 0 trong khi hô hấp. is_redirect. chuẩn bị_request = yêu cầu. sao chép[] thử. đáp lại. nội dung # Tiêu thụ ổ cắm để có thể phát hành ngoại trừ [ChunkedEncodingError, ContentDecodingError, RuntimeError]. đáp lại. thô. đã đọc [decode_content=False] nếu tôi >= tự. max_redirects. nâng TooManyRedirects['Đã vượt quá %s chuyển hướng. ' % bản thân. max_redirects] # Giải phóng kết nối trở lại nhóm. đáp lại. close[] url = resp. tiêu đề ['vị trí'] phương thức = req. phương pháp # Xử lý chuyển hướng mà không có sơ đồ [xem. RFC 1808 Phần 4] nếu url. bắt đầu với['//']. parsed_rurl = urlparse[resp. url] url = '%s. %s' % [parsed_rurl. lược đồ, url] # Lược đồ phải là chữ thường. đã phân tích cú pháp = urlparse[url] url = đã phân tích cú pháp. geturl[] # Tạo điều kiện thuận lợi cho các tiêu đề 'vị trí' không tuân thủ RFC2616 # [e. g. '/path/to/resource' thay vì 'http. //miền. tld/path/to/resource'] # Tuân thủ RFC3986, chúng tôi phần trăm mã hóa url. nếu không urlparse[url]. netloc. url = urljoin[tương ứng. url, requote_uri[url]] khác. url = requote_uri[url] chuẩn bị_request. url = to_native_string[url] # http. //www. w3. org/Giao thức/rfc2616/rfc2616-sec10. html#sec10. 3. 4 nếu [tương ứng. status_code == mã. see_other và phương pháp. = 'ĐẦU']. method = 'GET' # Làm những gì trình duyệt làm, bất chấp các tiêu chuẩn. # Đầu tiên, biến 302 thành GET. nếu đáp lại. status_code == mã. tìm thấy và phương pháp. = 'ĐẦU'. method = 'GET' # Thứ hai, nếu POST được phản hồi bằng 301, hãy biến nó thành GET. # Hành vi kỳ lạ này được giải thích trong Vấn đề 1704. nếu đáp lại. status_code == mã. đã di chuyển và phương thức == 'POST'. phương pháp = 'NHẬN' chuẩn bị_request. phương pháp = phương pháp # https. //github. com/kennethreitz/requests/issues/1084 nếu đáp ứng. status_code không có trong [mã. tạm thời, mã. bản tóm tắt]. nếu 'Độ dài nội dung' trong chuẩn bị_request. tiêu đề. xóa chuẩn bị_request. tiêu đề['Độ dài nội dung'] chuẩn bị_request. nội dung = Không có tiêu đề = chuẩn bị_request. thử tiêu đề. del tiêu đề ['Cookie'] ngoại trừ KeyError. vượt qua extract_cookies_to_jar[prepared_request. _cookie, chuẩn bị_request, tương ứng. nguyên] chuẩn bị_request. _bánh quy. cập nhật [tự. cookie] đã chuẩn bị_request. chuẩn bị_cookies[prepared_request. _cookies] # Xây dựng lại thông tin xác thực và proxy. đại diện = chính mình. tự xây dựng lại_proxies[prepared_request, proxy]. build_auth[prepared_request, resp] # Ghi đè yêu cầu ban đầu. req=chuẩn bị_request resp=self. gửi [ req, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies, allow_redirects=False, ] extract_cookies_to_jar[self. cookie, chuẩn bị_request, resp. raw] i += 1 năng suất resp def Build_auth[self, chuẩn bị_request, phản hồi]. """ Khi được chuyển hướng, chúng tôi có thể muốn loại bỏ xác thực khỏi yêu cầu để tránh rò rỉ thông tin xác thực. Phương pháp này loại bỏ và áp dụng lại xác thực một cách thông minh nếu có thể để tránh mất thông tin xác thực. tiêu đề """ = chuẩn bị_request. url tiêu đề = chuẩn bị_request. url nếu 'Ủy quyền' trong tiêu đề. # Nếu chúng tôi được chuyển hướng đến một máy chủ lưu trữ mới, chúng tôi nên loại bỏ bất kỳ # tiêu đề xác thực nào. original_parsed = urlparse[phản hồi. lời yêu cầu. url] redirect_parsed = urlparse[url] nếu [ original_parsed. tên máy chủ. = redirect_parsed. tên máy chủ]. tiêu đề del['Ủy quyền'] #. netrc có thể có nhiều xác thực hơn cho chúng tôi trên máy chủ mới của chúng tôi. new_auth = get_netrc_auth[url] nếu tự. trust_env khác Không có nếu new_auth không có Không có. chuẩn bị_request. chuẩn bị_auth[new_auth] trả về defbuild_proxies[bản thân, chuẩn bị_request, proxy]. """ Phương pháp này đánh giá lại cấu hình proxy bằng cách xem xét các biến môi trường. Nếu chúng tôi được chuyển hướng đến một URL được bao phủ bởi NO_PROXY, chúng tôi sẽ loại bỏ cấu hình proxy. Nếu không, chúng tôi sẽ đặt các khóa proxy bị thiếu cho URL này [trong trường hợp chúng bị loại bỏ bởi một chuyển hướng trước đó]. Phương pháp này cũng thay thế tiêu đề Ủy quyền ủy quyền khi cần thiết. tiêu đề """ = chuẩn bị_request. url tiêu đề = chuẩn bị_request. lược đồ url = urlparse[url]. lược đồ new_proxies = proxy. sao chép [] nếu proxy không Không có gì khác {} nếu tự. trust_env và không nên_bypass_proxies[url]. environ_proxies = get_environ_proxies[url] proxy = environ_proxies. nhận [sơ đồ] nếu proxy. new_proxies. setdefault[scheme, environ_proxies[scheme]] nếu 'Ủy quyền proxy' trong tiêu đề. del headers['Proxy-Authorization'] hãy thử. tên người dùng, mật khẩu = get_auth_from_url[new_proxies[scheme]] ngoại trừ KeyError. tên người dùng, mật khẩu = Không có, Không có nếu tên người dùng và mật khẩu. headers['Proxy-Authorization'] = _basic_auth_str[tên người dùng, mật khẩu] return new_proxiesclass Session[SessionRedirectMixin]. """Một phiên yêu cầu. Cung cấp tính bền vững của cookie, tổng hợp kết nối và cấu hình. Sử dụng cơ bản. >>> nhập yêu cầu >>> s = yêu cầu. Phiên[] >>> s. lấy ['http. //httpbin. org/get'] 200 """ __attrs__ = [ 'tiêu đề', 'cookie', 'auth', 'hết thời gian', 'proxies', 'hook', 'params', 'verify', 'cert', 'prefetch . #. Từ điển tiêu đề phân biệt chữ hoa chữ thường được gửi trên mỗi #. . tầng lớp. `Yêu cầu` được gửi từ # này. . tầng lớp. `Phiên`. bản thân. tiêu đề = default_headers[] #. Bộ xác thực mặc định hoặc đối tượng để đính kèm vào #. . tầng lớp. `Yêu cầu`. bản thân. xác thực = Không có #. Giao thức ánh xạ từ điển tới URL của proxy [e. g. #. {'http'. 'foo. quán ba. 3128'}] được sử dụng trên mỗi #. . tầng lớp. `Yêu cầu`. bản thân. proxy = {} #. Móc xử lý sự kiện. bản thân. móc = default_hooks[] #. Từ điển dữ liệu chuỗi truy vấn để đính kèm với mỗi #. . tầng lớp. `Yêu cầu`. Các giá trị từ điển có thể là danh sách cho #. đại diện cho các tham số truy vấn đa giá trị. bản thân. tham số = {} #. Luồng nội dung phản hồi mặc định. bản thân. luồng = Sai #. Xác minh SSL mặc định. bản thân. xác minh = Đúng #. Chứng chỉ SSL mặc định. bản thân. chứng chỉ = Không có #. Số lần chuyển hướng tối đa được phép. Nếu yêu cầu vượt quá # này. giới hạn, một. tầng lớp. Ngoại lệ `TooManyRedirects` được nâng lên. bản thân. max_redirects = DEFAULT_REDIRECT_LIMIT #. Chúng ta có nên tin tưởng vào môi trường? . trust_env = Đúng #. Một CookieJar chứa tất cả các cookie hiện đang tồn đọng được đặt trên # này. phiên họp. Theo mặc định, nó là một #. . tầng lớp. `RequestsCookieJar`, nhưng #. có thể là bất kỳ ``cookielib nào khác. đối tượng tương thích CookieJar``. bản thân. cookie = cookiejar_from_dict[{}] # Bộ điều hợp kết nối mặc định. bản thân. bộ điều hợp = OrderedDict[] tự. gắn kết ['https. //', HTTPAdapter[]] tự. gắn kết ['http. //', HTTPAdapter[]] def __enter__[self]. tự trả lại def __exit__[self, *args]. bản thân. close[] def chuẩn bị_request[tự, yêu cầu]. """Xây dựng một. tầng lớp. `PreparedRequest` để truyền và trả về. Các. tầng lớp. `PreparedRequest` có các cài đặt được hợp nhất từ. tầng lớp. Ví dụ `Request` và của. tầng lớp. `Phiên`. . yêu cầu thông số. . tầng lớp. Phiên bản `Yêu cầu` để chuẩn bị với cài đặt của phiên này. """ cookie = yêu cầu. cookie hoặc {} # Bootstrap CookieJar. nếu không isinstance[cookies, cookielib. CookieJar]. cookie = cookiejar_from_dict[cookies] # Hợp nhất với cookie phiên merge_cookies = merge_cookies[ merge_cookies[RequestsCookieJar[], self. cookie], cookie] # Đặt xác thực cơ bản của môi trường nếu không được đặt rõ ràng. xác thực = yêu cầu. xác thực nếu tự. trust_env chứ không phải auth và không phải bản thân. xác thực. auth = get_netrc_auth[yêu cầu. url] p = PreparedRequest[] p. chuẩn bị [phương pháp = yêu cầu. phương pháp. trên[], url=yêu cầu. url, tệp = yêu cầu. tệp, dữ liệu=yêu cầu. dữ liệu, tiêu đề=merge_setting[yêu cầu. tiêu đề, tự. tiêu đề, dict_class=CaseInsensitiveDict], params=merge_setting[yêu cầu. thông số, bản thân. params], auth=merge_setting[auth, self. auth], cookie=merged_cookies, hooks=merge_hooks[yêu cầu. móc, tự. hooks], ] trả về p def request[self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxy=None . """Xây dựng một. tầng lớp. `Yêu cầu`, chuẩn bị và gửi. trả lại. tầng lớp. đối tượng `phản hồi`. . phương pháp tham số. phương pháp mới. tầng lớp. đối tượng `yêu cầu`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . thông số thông số. [tùy chọn] Từ điển hoặc byte sẽ được gửi trong chuỗi truy vấn cho. tầng lớp. `Yêu cầu`. . dữ liệu thông số. [tùy chọn] Từ điển hoặc byte để gửi trong phần thân của. tầng lớp. `Yêu cầu`. . tiêu đề thông số. [tùy chọn] Từ điển tiêu đề HTTP để gửi cùng với. tầng lớp. `Yêu cầu`. . thông số cookie. [tùy chọn] Đối tượng Dict hoặc CookieJar để gửi cùng với. tầng lớp. `Yêu cầu`. . tệp thông số. [tùy chọn] Từ điển 'tên tệp'. các đối tượng giống như tệp để tải lên mã hóa nhiều phần. . thông số xác thực. [tùy chọn] Tuple xác thực hoặc có thể gọi để bật Xác thực HTTP cơ bản/Thông báo/Tùy chỉnh. . thời gian chờ thông số. [tùy chọn] Float mô tả thời gian chờ của yêu cầu tính bằng giây. . tham số allow_redirects. [tùy chọn] Boolean. Đặt thành True theo mặc định. . thông số proxy. [tùy chọn] Giao thức ánh xạ từ điển tới URL của proxy. . luồng thông số. [tùy chọn] có tải xuống ngay nội dung phản hồi hay không. Mặc định là ``False``. . xác minh thông số. [tùy chọn] nếu ``True``, chứng chỉ SSL sẽ được xác minh. Đường dẫn CA_BUNDLE cũng có thể được cung cấp. . chứng chỉ thông số. [tùy chọn] nếu Chuỗi, đường dẫn đến tệp chứng chỉ ứng dụng khách ssl [. pem]. Nếu cặp Tuple, ['cert', 'key']. """ method = builtin_str[method] # Tạo Yêu cầu. req = Yêu cầu [ phương pháp = phương pháp. upper[], url = url, headers = headers, files = files, data = data or {}, params = params or {}, auth = auth, cookies = cookies, hooks = hooks, ] prep = self. prepare_request[req] proxy = proxy hoặc {} # Thu thập manh mối từ môi trường xung quanh. nếu tự. Trust_env. # Đặt proxy của môi trường. env_proxies = get_environ_proxies[url] hoặc {} for [k, v] trong env_proxies. mặt hàng[]. ủy nhiệm. setdefault[k, v] # Tìm cấu hình. nếu không xác minh và xác minh không sai. xác minh = os. môi trường. get['REQUESTS_CA_BUNDLE'] # Tương thích cuộn tròn. nếu không xác minh và xác minh không sai. xác minh = os. môi trường. get['CURL_CA_BUNDLE'] # Hợp nhất tất cả kwargs. proxy = merge_setting[proxy, tự. proxy] stream = merge_setting[stream, self. luồng] verify = merge_setting[xác minh, tự. xác minh] cert = merge_setting[cert, self. cert] # Gửi yêu cầu. send_kwargs = { 'luồng'. luồng, 'hết thời gian chờ'. hết thời gian, 'xác minh'. xác minh, 'chứng chỉ'. chứng chỉ, 'proxy'. proxy, 'allow_redirects'. allow_redirects, } resp = self. send[prep, **send_kwargs] return resp def get[self, url, **kwargs]. """Gửi yêu cầu NHẬN. trả lại. tầng lớp. đối tượng `phản hồi`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . tham số \*\*kwargs. Các đối số tùy chọn mà ``yêu cầu`` sử dụng. """ kwargs. setdefault['allow_redirects', True] tự trả về. yêu cầu ['NHẬN', url, **kwargs] tùy chọn xác định [bản thân, url, **kwargs]. """Gửi yêu cầu TÙY CHỌN. trả lại. tầng lớp. đối tượng `phản hồi`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . tham số \*\*kwargs. Các đối số tùy chọn mà ``yêu cầu`` sử dụng. """ kwargs. setdefault['allow_redirects', True] tự trả về. request['OPTIONS', url, **kwargs] def head[self, url, **kwargs]. """Gửi yêu cầu HEAD. trả lại. tầng lớp. đối tượng `phản hồi`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . tham số \*\*kwargs. Các đối số tùy chọn mà ``yêu cầu`` sử dụng. """ kwargs. setdefault['allow_redirects', False] tự trả về. request['HEAD', url, **kwargs] def post[self, url, data=None, **kwargs]. """Gửi yêu cầu POST. trả lại. tầng lớp. đối tượng `phản hồi`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . dữ liệu thông số. [tùy chọn] Từ điển, byte hoặc đối tượng giống như tệp để gửi trong phần thân của. tầng lớp. `Yêu cầu`. . tham số \*\*kwargs. Các đối số tùy chọn mà ``yêu cầu`` sử dụng. """ tự trả về. request['POST', url, data=data, **kwargs] def put[self, url, data=None, **kwargs]. """Gửi yêu cầu PUT. trả lại. tầng lớp. đối tượng `phản hồi`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . dữ liệu thông số. [tùy chọn] Từ điển, byte hoặc đối tượng giống như tệp để gửi trong phần thân của. tầng lớp. `Yêu cầu`. . tham số \*\*kwargs. Các đối số tùy chọn mà ``yêu cầu`` sử dụng. """ tự trả về. yêu cầu['PUT', url, data=data, **kwargs] bản vá lỗi [self, url, data=None, **kwargs]. """Gửi yêu cầu PATCH. trả lại. tầng lớp. đối tượng `phản hồi`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . dữ liệu thông số. [tùy chọn] Từ điển, byte hoặc đối tượng giống như tệp để gửi trong phần thân của. tầng lớp. `Yêu cầu`. . tham số \*\*kwargs. Các đối số tùy chọn mà ``yêu cầu`` sử dụng. """ tự trả về. request['PATCH', url, data=data, **kwargs] def xóa[self, url, **kwargs]. """Gửi yêu cầu XÓA. trả lại. tầng lớp. đối tượng `phản hồi`. . url tham số. URL cho cái mới. tầng lớp. đối tượng `yêu cầu`. . tham số \*\*kwargs. Các đối số tùy chọn mà ``yêu cầu`` sử dụng. """ tự trả về. yêu cầu ['XÓA', url, **kwargs] def gửi [bản thân, yêu cầu, **kwargs]. """Gửi một Yêu cầu Chuẩn bị đã cho. """ # Đặt giá trị mặc định mà các hook có thể sử dụng để đảm bảo chúng luôn có # tham số chính xác để tạo lại yêu cầu trước đó. kwargs. setdefault['stream', tự. suối] kwargs. setdefault['xác minh', tự. xác minh] kwargs. setdefault['chứng chỉ', tự. chứng chỉ] kwargs. setdefault['proxy', tự. proxy] # Có thể người dùng vô tình gửi một đối tượng Yêu cầu. # Bảo vệ chống lại trường hợp lỗi cụ thể đó. nếu không phải là thể hiện [yêu cầu, Chuẩn bị]. nâng cao ValueError ['Bạn chỉ có thể gửi Yêu cầu đã chuẩn bị. '] # Thiết lập các biến cần thiết để giải quyết_redirects và gửi hook allow_redirects = kwargs. luồng pop['allow_redirects', True] = kwargs. thời gian chờ get['stream'] = kwargs. get['timeout'] verify = kwargs. get['xác minh'] chứng chỉ = kwargs. get['cert'] proxy = kwargs. get['proxies'] hooks = yêu cầu. hooks # Lấy bộ chuyển đổi thích hợp để sử dụng bộ chuyển đổi = self. get_adapter[url=request. url] # Thời gian bắt đầu [xấp xỉ] của yêu cầu start = datetime. utcnow[] # Gửi yêu cầu r = adapter. gửi[yêu cầu, **kwargs] # Tổng thời gian đã trôi qua của yêu cầu [xấp xỉ] r. trôi qua = ngày giờ. utcnow[] - start # Móc thao tác phản hồi r = Clark_hook['response', hooks, r, **kwargs] # Duy trì cookie nếu r. lịch sử. # Nếu các hook tạo lịch sử thì chúng tôi cũng muốn những cookie đó được thay thế trong r. lịch sử. extract_cookies_to_jar[tự. cookie, đại diện. yêu cầu, đáp lại. raw] extract_cookies_to_jar[self. cookie, yêu cầu, r. raw] # Trình tạo phân giải chuyển hướng. gen = bản thân. resolve_redirects[r, request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies] # Giải quyết chuyển hướng nếu được phép. history = [resp for resp in gen] if allow_redirects other [] # Xáo trộn mọi thứ xung quanh nếu có lịch sử. nếu lịch sử. # Chèn yêu cầu [gốc] đầu tiên vào lịch sử bắt đầu. insert[0, r] # Nhận yêu cầu cuối cùng được thực hiện r = history. pop[] r. history = lịch sử nếu không stream. r. nội dung trả về r def get_adapter[self, url]. """Trả về bộ điều hợp kết nối thích hợp cho URL đã cho. """ cho [tiền tố, bộ điều hợp] trong chính nó. bộ điều hợp. mặt hàng[]. nếu url. thấp hơn[]. bắt đầu bằng [tiền tố]. trả lại bộ điều hợp # Không có gì phù hợp. -/ raise InvalidSchema["Không tìm thấy bộ điều hợp kết nối nào cho '%s'" % url] def close[self]. """Đóng tất cả các bộ điều hợp và phiên như vậy""" cho v trong chính nó. bộ điều hợp. giá trị[]. v. close[] def mount[bản thân, tiền tố, bộ điều hợp]. """Đăng ký bộ điều hợp kết nối thành tiền tố. Bộ điều hợp được sắp xếp theo thứ tự giảm dần theo độ dài khóa. """ bản thân. bộ điều hợp [tiền tố] = bộ điều hợp keys_to_move = [k cho chính k. bộ điều hợp nếu len[k] < len[prefix]] cho khóa trong keys_to_move. bản thân. bộ điều hợp [key] = tự. bộ điều hợp. pop[key] def __getstate__[self]. return dict[[attr, getattr[self, attr, None]] cho attr trong self. __attrs__] def __setstate__[bản thân, trạng thái]. cho attr, giá trị ở trạng thái. mặt hàng[]. setattr[self, attr, value]def session[]. """Trả về một. tầng lớp. `Session` để quản lý ngữ cảnh. """ trả lại phiên []

Chủ Đề