1. http.cookies HTTP cookie
http.cookies模塊為大多數符合RFC2109的cookie實作一個決議器,這個實作沒有標準那么嚴格,因為MSIE3.0x不支持完整的標準,
1.1 創建和設定cookie
可以用cookie為基于瀏覽器的應用實作狀態管理,因此,cookie通常由服務器設定,并由客戶存盤和回傳,下面給出一個最簡單的例子,創建一個cookie設定一個鍵值對,
from http import cookies c = cookies.SimpleCookie() c['mycookie'] = 'cookie_value' print(c)
輸出是一個合法的Set-Cookie首部,可以作為HTTP回應的一部分傳遞到客戶,

1.2 Morsel
還可以控制 cookie的其他方面,如到期時間、路徑和域,實際上,cookie的所有RFC屬性都可以通過表示cookie值的Morse1物件來管理,
from http import cookies import datetime def show_cookie(c): print(c) for key, morsel in c.items(): print() print('key =', morsel.key) print(' value =https://www.cnblogs.com/liuhui0308/p/', morsel.value) print(' coded_value =https://www.cnblogs.com/liuhui0308/p/', morsel.coded_value) for name in morsel.keys(): if morsel[name]: print(' {} = {}'.format(name, morsel[name])) c = cookies.SimpleCookie() # A cookie with a value that has to be encoded # to fit into the header c['encoded_value_cookie'] = '"cookie,value;"' c['encoded_value_cookie']['comment'] = 'Has escaped punctuation' # A cookie that only applies to part of a site c['restricted_cookie'] = 'cookie_value' c['restricted_cookie']['path'] = '/sub/path' c['restricted_cookie']['domain'] = 'PyMOTW' c['restricted_cookie']['secure'] = True # A cookie that expires in 5 minutes c['with_max_age'] = 'expires in 5 minutes' c['with_max_age']['max-age'] = 300 # seconds # A cookie that expires at a specific time c['expires_at_time'] = 'cookie_value' time_to_live = datetime.timedelta(hours=1) expires = (datetime.datetime(2020, 4, 8, 18, 30, 14) + time_to_live) # Date format: Wdy, DD-Mon-YY HH:MM:SS GMT expires_at_time = expires.strftime('%a, %d %b %Y %H:%M:%S') c['expires_at_time']['expires'] = expires_at_time show_cookie(c)
這個例子使用兩個不同的方法設定到期的cookie,其中一個方法將max-age設定為一個秒數,另一個方法將expires設定為一個日期時間,達到這個日期時間就會丟棄這個cookie,

Cookie和Morsel物件都相當于字典,Morsel回應一個固定的鍵集,
expires
path
comment
domain
secure
version
Cookie實體的鍵是所存盤的各個cookie的名,這個資訊也可以從Morsel的鍵屬性得到,
1.3 編碼的值
cookie首部值必須經過編碼才能被正確的決議,
from http import cookies c = cookies.SimpleCookie() c['integer'] = 5 c['with_quotes'] = 'He said, "Hello, World!"' for name in ['integer', 'with_quotes']: print(c[name].key) print(' {}'.format(c[name])) print(' value=https://www.cnblogs.com/liuhui0308/p/{!r}'.format(c[name].value)) print(' coded_value=https://www.cnblogs.com/liuhui0308/p/{!r}'.format(c[name].coded_value)) print()
Morsel.value是cookie的解碼值,而Morsel.coded_value表示總是用來將值傳輸到客戶,這兩個值都是串,如果保存到一個cookie的值不是串,那么其將會自動轉換為串,

1.4 接收和決議Cookie首部
一旦客戶接收到Set-Cookie首部,在后續請求中它會使用一個Cookie首部把這些cookie回傳到服務器,到來的Cookie首部串可能包含多個cookie值,由分號分隔(;),
Cookie: integer=5; with_quotes="He said, \"Hello, World!\""
取決于Web服務器和框架,可以直接從首部或HTTP_COOKIE環境變數得到cookie,
from http import cookies HTTP_COOKIE = '; '.join([ r'integer=5', r'with_quotes="He said, \"Hello, World!\""', ]) print('From constructor:') c = cookies.SimpleCookie(HTTP_COOKIE) print(c) print() print('From load():') c = cookies.SimpleCookie() c.load(HTTP_COOKIE) print(c)
要對它們解碼,實體化時可以將串(但不包括首部前綴)傳遞到SimpleCookie,或者使用load()方法,

1.5 候選輸出格式
除了使用Set-Cookie首部,服務器還可以提供JavaScript向客戶增加cookie,SimpleCookie和Morsel通過js_output()方法來提供JavaScript輸出,
from http import cookies import textwrap c = cookies.SimpleCookie() c['mycookie'] = 'cookie_value' c['another_cookie'] = 'second value' js_text = c.js_output() print(textwrap.dedent(js_text).lstrip())
結果是一個完整的script標記,其中包含設定cookie的陳述句,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159121.html
標籤:Python
