Python中实现Session和Token

发布于:2025-06-19 ⋅ 阅读:(14) ⋅ 点赞:(0)

Session和Token的区别

在Web应用和身份验证系统中,二者是用于管理用户状态和身份验证的两种常用机制。

Session是一种服务端存储用户状态的机制。当用户登录后,服务器会为该用户创建一个唯一的Session ID,通常存储在服务器的内存或数据库中。并通过Cookie或URL参数将Session ID发送给客户端。

其特点如下:

  • Session ID是用户与服务器之间的唯一标识;
  • 用户的状态信息(如登录状态、用户权限等)存储在服务端;
  • 客户端只需要保存Session ID,无需存储敏感信息;

Token为一种客户端存储用户身份信息的机制。用户登录后,服务器会生成一个包含用户身份信息的Token,并将其发送给客户端。客户端在后续请求中携带该Token,服务器通过验证Token来确认用户身份。

其特点如下:

  • Token包含用户身份信息(如用户ID、权限等),通常经过加密或签名。
  • Token存储在客户端(如Cookie、LocalStorage、Header等)。
  • 服务器无需存储用户状态,只需验证Token的有效性。

 

TOKEN获取代码示例:

import requests
import time
from typing import Optional, Dict, Any


class TokenManager:
    def __init__(self, login_url: str, username: str, password: str):
        """
        初始化Token管理器。

        :param login_url: 登录接口URL
        :param username: 用户名
        :param password: 密码
        """
        self.login_url = login_url
        self.username = username
        self.password = password
        self.token: Optional[str] = None
        self.token_expires_at: Optional[float] = None  # Token过期时间戳
        self.refresh_interval: int = 300  # 提前刷新Token的时间(秒),避免过期

    def _fetch_token(self) -> Dict[str, Any]:
        """
        从登录接口获取Token。

        :return: 包含Token和过期时间的字典
        """
        login_data = {
            "username": self.username,
            "password": self.password
        }
        response = requests.post(self.login_url, json=login_data)
        print(f"响应报文为:{response.text}")
        if response.status_code == 200:
            data = response.json()
            self.token = data["data"]["access_token"]
            # 假设API返回Token的过期时间(单位:秒)
            expires_in = data.get("expires_in", 3600)  # 默认1小时过期
            self.token_expires_at = time.time() + expires_in - self.refresh_interval
            return {"token": self.token, "expires_at": self.token_expires_at}
        else:
            raise Exception(f"登录失败,状态码: {response.status_code}, 错误信息: {response.text}")

    def get_token(self) -> str:
        """
        获取当前有效的Token,如果Token过期则自动刷新。

        :return: 有效的Token
        """
        if self.token is None or time.time() >= self.token_expires_at:
            self._fetch_token()
        return self.token

    def refresh_token_if_needed(self) -> None:
        """
        检查Token是否需要刷新,如果需要则刷新。
        """
        if self.token is None or time.time() >= self.token_expires_at:
            self._fetch_token()

if __name__ == "__main__":
    token_manager = TokenManager(
        login_url="https://skawms.sit.sf-express.com/api/sys/login",
        username="01369530",
        password="LF5/N2uYvtjjXWAO1ny8EBD1Df0pnUoFu5brpRONKXpru9/xQwSb+etPxY1r1RRlKUap8DrJa0Bw6jcUqyNu4tOuFIvXCjo2GjXkvK4UvYISl3XLKEaRkV96SMEu0ZW1bXWMynPu0Z5iF7qvZ457oMGDWP54VA/wnPmPsnYPtEU="
    )
    token = token_manager.get_token()
    print("Token:", token)


网站公告

今日签到

点亮在社区的每一天
去签到