[Python]-使用Requests模拟登录

文章目录

  • 登录说明
    • session操作
    • data序列化
  • 示例代码
    • 登录流程
    • 验证

在《使用Requests进行HTTP请求与文件上传下载》中介绍了requests库的常用方法,本章介绍如何使用request进行用户登录。

登录说明

一般页面登录都是使用Form实现的,以登录如下页面为例:


<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

你可能感兴趣的:(Python,python,cookie)