我目前有一個名為 Client 的類,它具有登錄網站并使用 python 請求與之互動的功能。但是,我的登錄功能有些復雜。我必須訪問大約 10 個不同的端點來收集正確的 cookie 才能登錄。因此,我有 10 個不同的函式用于登錄程序來收集所有這些 cookie,這些 cookie 使我的 Client 類變得混亂。我還為每個請求使用了一個實體變數 self.session 來自動將我的會話 cookie 更新為最新的請求。
class Client:
def __init__(self):
self.session = requests.Session()
def login_func1(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func2(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func3(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func4(self, url, headers):
resp = self.session.get(url, headers=headers)
..........
def login_func10(self, url, headers):
resp = self.session.get(url, headers=headers)
def login(self, url, headers, username, password):
self.loginin_func1(url, header)
self.loginin_func2(url, header)
self.loginin_func3(url, header)
self.loginin_func4(url, header)
......
self.loginin_func10(url, header)
resp = self.session.get(url, payload = {'user':username, 'password':password}, headers=headers)
if resp.status_code == 200:
print('Successfully logged in!')
def get_images(self, url, headers):
#get images code here
def get_table_data(self, url, headers):
#get table data code here
我想將登錄功能可能分離到另一個類中。我不確定我是否應該只創建一個名為 LogIn 的單獨物件并將 self.session 變數傳遞給該類,或者我是否應該以某種方式使 LogIn 從 Client 繼承。但是,在 LogIn 類完成登錄后,我需要回傳客戶端與站點進行互動。我不確定分離它的最佳方法是什么。我最初在考慮類似下面的內容,但不確定繼承是否會更好,甚至可能的選擇。謝謝!
from login import LogIn
class Client:
def __init__(self):
self.session = requests.Session()
def login(self, url, headers):
self.session = LogIn(self.session).login(url, headers, username, password)
def get_images(self, url, headers):
//get images code here
def get_table_data(self, url, headers):
//get table data code here
class LogIn:
def __init__(self, session):
self.session = session
def login_func1(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func2(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func3(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func4(self, url, headers):
resp = self.session.get(url, headers=headers)
..........
def login_func10(self, url, headers):
resp = self.session.get(url, headers=headers)
def login(self, url, headers, username, password):
self.loginin_func1(url, header)
self.loginin_func2(url, header)
self.loginin_func3(url, header)
self.loginin_func4(url, header)
......
self.loginin_func10(url, header)
resp = self.session.get(url, payload = {'user':username, 'password':password}, headers=headers)
if resp.status_code == 200:
print('Successfully logged in!")
return self.session
uj5u.com熱心網友回復:
您的繼承想法似乎是一個好方法。
我建議讓 LogIn 類從 Session 繼承,這樣您就可以使用它來創建 Session 并通過所需的登錄功能對其進行自定義:
class Client:
def __init__(self):
self.session = LoginSession()
def login(self, url, headers, username, password):
self.session.login(url, headers, username, password)
class LoginSession(requests.Session):
def login(self, url, headers, username, password):
self.login_func1(url, headers)
# [...]
self.login_func10(url, headers)
resp = self.get(
url, payload={"user": username, "password": password}, headers=headers
)
if resp.status_code == 200:
print("Successfully logged in!")
def login_func1(self, url, headers):
resp = self.get(url, headers=headers)
# [...]
def login_func10(self, url, headers):
resp = self.get(url, headers=headers)
uj5u.com熱心網友回復:
很難準確地說出您的各種login_funcN功能有什么不同,因為對于您的示例,您已經將問題簡化得太多了。但是,如果在不同的登錄作業之間唯一需要更改的是 URL 和標頭,您可能會考慮將這些資料單獨打包到一個資料結構中,而不是為每個步驟使用單獨的函式。資料可以與類的其余部分分開存盤,因此您可能根本不需要第二個類(只是一個保存登錄資料的資料結構)。
cookie_gathering_data = [(cookie_url1, cookie_headers1),
(cookie_url2, cookie_headers2),
...]
class Client:
def login(self, cookie_data, url, headers, username, password):
for cookie_url, cookie_headers in cookie_data:
self.session.get(cookie_url, headers=cookie_headers)
resp = self.session.get(url, payload={'user':username, 'password':password},
headers=headers)
if resp.status_code == 200:
print('Successfully logged in!')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496391.html
標籤:Python python-3.x 哎呀 蟒蛇请求
上一篇:在基類參考上轉換繼承類
