Python3標准庫:http.cookies HTTP cookie


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 =', morsel.value)
        print('  coded_value =', 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={!r}'.format(c[name].value))
    print('  coded_value={!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的語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM