天天看點

python接口測試(二)-- session/cookies關聯session關聯cookies關聯

session關聯

session是什麼?

我們知道,用浏覽器打開一個網頁,用到的是HTTP協定,而這個協定是無狀态的。也就是說,這一次的請求和上一次的請求是沒有任何關系的,互不相認。是以就會産生一個問題,比如我在購物的時候,在某頁面浏覽了商品,購買時跳轉第二個頁面,由于是無狀态的,第二個請求無法擷取第一個頁面的商品資訊。

這時候就需要用到session機制了。就是當通路一個頁面時給浏覽器建立一個獨一無二的号碼,也給同時建立的session賦予同樣的号碼。這樣就可以在打開同一個網站的第二個頁面時擷取到第一個頁面中session保留下來的資訊。這個号碼就是sessionID,session的ID号,獨一無二。

cookies就是把session的ID放在cookie裡面(因為cookie有臨時的也有定時的,而臨時的就是當浏覽器什麼時候關掉即消失,也就是說session本來就是當浏覽器關閉即消失,是以用臨時的cookie存放。)

cookies是存放在用戶端本地,而session的資料是儲存在伺服器端。

接口案例

python接口測試(二)-- session/cookies關聯session關聯cookies關聯

如果後續的接口都需要依賴登入才能通路,那麼就需要用到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'}

'''
           
python接口測試(二)-- session/cookies關聯session關聯cookies關聯

案例示範

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關聯

python接口測試(二)-- session/cookies關聯session關聯cookies關聯

我們第一次發請求到服務端,是不會帶cookie的,伺服器會傳回一個cookie存儲在用戶端

python接口測試(二)-- session/cookies關聯session關聯cookies關聯

發送第二次請求的時候,會帶上這個cookie

python接口測試(二)-- session/cookies關聯session關聯cookies關聯

案例示範

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/>]>
登入成功
'''
           

繼續閱讀