在《使用Requests进行HTTP请求与文件上传下载》中介绍了requests库的常用方法,本章介绍如何使用request进行用户登录。
登录说明
一般页面登录都是使用Form实现的,以登录如下页面为例:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
Invalid username and password.
</div>
<div th:if="${param.logout}">
You have been logged out.
</div>
<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>
session操作
一般页面登录后,都需要返回session(保存在cookies中)用于后续的验证,可通过LWPCookieJar方便地进行cookies的保存与加载。为例方便cookies操作,使用requests.session(),代替requests进行请求操作。
默认情况下,LWPCookieJar保存与加载时,会忽略掉discard与expired的项,为能正常的保存与加载,需要使用参数ignore_discard=True, ignore_expires=True
。
data序列化
请求参数中data会根据类型不同进行不同方式的序列化,在models.py的prepare_body中有对data的详细实现。
对于字典格式的data,会序列化为k1=v1&k2=v2
格式,并在未设定content_type情况下,设定为application/x-www-form-urlencoded
。
示例代码
登录流程
在登录成功后,保存session到文件中,以便后续使用:
import requests
import requests.utils
import http.cookiejar as cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='./security.cookie')
BaseUrl = 'http://127.0.0.1:7087/study/'
header = {
'Referer': BaseUrl + "login",
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/89.0.4389.82'
}
def login(user, psw):
try:
data = {
'username': user,
'password': psw,
}
resp = session.post(url=BaseUrl + 'login', headers=header, data=data)
print(resp)
if resp.status_code == requests.codes.ok:
print('redirect url:', resp.url)
cookie = requests.utils.dict_from_cookiejar(session.cookies)
print(cookie)
session.cookies.save(ignore_discard=True, ignore_expires=True)
# if canRedirect(BaseUrl):
# print("Login success")
except Exception as ex:
print(ex)
验证
登录成功即使返回ok,也不一定是真的成果;最准确的方式是尝试登录一个需要验证的页面,若返回成功,则是真正的成功:
def canRedirect(url):
try:
# session.cookies.load(ignore_discard=True, ignore_expires=True)
resp = session.get(url, headers=header)
print(resp)
return resp.status_code == requests.codes.ok
except Exception as ex:
print(ex)
return False