session關聯
session是什麼?
我們知道,用浏覽器打開一個網頁,用到的是HTTP協定,而這個協定是無狀态的。也就是說,這一次的請求和上一次的請求是沒有任何關系的,互不相認。是以就會産生一個問題,比如我在購物的時候,在某頁面浏覽了商品,購買時跳轉第二個頁面,由于是無狀态的,第二個請求無法擷取第一個頁面的商品資訊。
這時候就需要用到session機制了。就是當通路一個頁面時給浏覽器建立一個獨一無二的号碼,也給同時建立的session賦予同樣的号碼。這樣就可以在打開同一個網站的第二個頁面時擷取到第一個頁面中session保留下來的資訊。這個号碼就是sessionID,session的ID号,獨一無二。
cookies就是把session的ID放在cookie裡面(因為cookie有臨時的也有定時的,而臨時的就是當浏覽器什麼時候關掉即消失,也就是說session本來就是當浏覽器關閉即消失,是以用臨時的cookie存放。)
cookies是存放在用戶端本地,而session的資料是儲存在伺服器端。
接口案例
如果後續的接口都需要依賴登入才能通路,那麼就需要用到session機制了,即隻登入一次,後面的請求會預設的帶到token頭部資訊。
import requests
s = requests.session() # 建立一個session會話,模拟浏覽器功能
print(s.headers)
print(s.cookies)
url = 'http://xx.xx.xx.xx:9000/api/v1/login'
body = {
'username': 'test',
'password': '123456'
}
re = s.post(url, json=body)
print(re.json())
# token
token = re.json()['token']
print('擷取的token:%s' % token)
h = {'Authorization': 'Token %s' % token}
s.headers.update(h) # 更新到session會話
# 更新之後的頭部
print(s.headers)
'''
=======================================================================================================================
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
<RequestsCookieJar[]>
{'code': 0, 'msg': 'login success!', 'username': 'test', 'token': 'a1e27565bcbfa0a950f3b041a1e38bf0b9d2a45d'}
擷取的token:a1e27565bcbfa0a950f3b041a1e38bf0b9d2a45d
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Token a1e27565bcbfa0a950f3b041a1e38bf0b9d2a45d'}
'''
案例示範
import requests
s = requests.session() # 建立一個session會話,模拟浏覽器功能
# 1.登入
host = 'http://xx.xx.xx.xx:xxx'
login_url = host + '/api/v1/login'
login_body = {
'username': 'test',
'password': '123456'
}
re = s.post(url=login_url, json=login_body)
print(re.json())
# token
token = re.json()['token']
print('擷取的token:%s' % token)
h = {'Authorization': 'Token %s' % token}
s.headers.update(h) # 更新到session會話
# 更新之後的頭部
print('更新之後的頭部:%s' % s.headers)
# 2.擷取個人資訊
getInfo_url = host + '/api/v1/userinfo'
r = s.get(url=getInfo_url)
print(r.json())
'''
運作結果:
=================================================================================================
{'code': 0, 'msg': 'login success!', 'username': 'test', 'token': 'fea9a5e6521c87e1312335b85a01263fd536432a'}
擷取的token:fea9a5e6521c87e1312335b85a01263fd536432a
更新之後的頭部:{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Token fea9a5e6521c87e1312335b85a01263fd536432a'}
{'msg': 'sucess!', 'code': 0, 'data': [{'id': 105, 'name': 'test', 'sex': 'M', 'age': 20, 'mail': '[email protected]', 'create_time': '2020-03-31'}]}
'''
cookies關聯
我們第一次發請求到服務端,是不會帶cookie的,伺服器會傳回一個cookie存儲在用戶端
發送第二次請求的時候,會帶上這個cookie
案例示範
import requests
import re
url = 'http://xx.xx.xx.xx:xxxx/admin/login/?next=/admin/'
s = requests.session()
# 沒通路伺服器之前cookie為空
print(s.cookies)
# 第一次通路伺服器,伺服器傳回cookie,session會自動儲存
r1 = s.get(url)
print(s.cookies)
# 第二次發送登入請求
# 由于csrfmiddlewaretoken參數被隐藏,是以在頁面看不到,但是發送請求的時候有這個參數
# 這個參數是第一次通路時,根據cookie自動生成的,是以需要用到re子產品,通過正規表達式提取
csrfmiddlewaretoken = re.findall("name='csrfmiddlewaretoken' value='(.+?)'", r1.text)
body = {
'csrfmiddlewaretoken': csrfmiddlewaretoken[0],
'username': 'xxx',
'password': 'xxxxx',
'next': '/admin/'
}
r2 = s.post(url, data=body)
# 判斷是否登入成功
if 'Site administration | Django site admin' in r2.text:
print('登入成功')
else:
print('登入失敗')
'''
運作結果:
========================================================================================================================
<RequestsCookieJar[]>
<RequestsCookieJar[<Cookie csrftoken=Dk4l1RP8XsCNmcGccSq2S17l4YIWyaGyLtuaVXzDXRCAsea1xwXoOytCZBbD87Pg for 49.235.92.12/>]>
登入成功
'''