python解决token传值问题

本文介绍了如何在Python中使用token进行接口调用,包括创建ApiFunction类处理登录获取token,以及在test01_function.py中测试登录和消息通知功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python解决token传值问题
准备一个使用到token接口
https://xxx.com
准备目录/软件包/.py文件
  • api
    • api_function.py
  • script
    • test01_function.py
  • config.py

config.py

HOST = "https://xxx.com"
TOKEN = None

api_function.py

from config import HOST


class ApiFunction:
    def __init__(self, session):
        self.session = session
        # 登录
        self.__url_login = HOST + "访问方向"
        # 消息通知
        self.__url_message = HOST + "访问方向"

    # 登录
    def api_login(self, password, mobile):
        data = {
            "password": password,
            "mobile": mobile
        }
        result = self.session.post(url=self.__url_login, data=data)
        # 检查响应
        if result.status_code == 200:
            data = result.json()
            if "data" in data:
                token = data["data"]["token"]
                print("api提取到的 token 值:", token)
                # return token  # 返回提取到的 token 值
                return token
            else:
                print("api未找到 token 值")
        else:
            print("api登录请求失败,状态码:", result.status_code)
        return None

    # 获取消息通知
    def api_message(self, token):
        if token is None:
            print("未找到有效的 token 请先执行登录方法")
            return

        headers = {"Authorization": "Bearer " + token}
        result = self.session.get(url=self.__url_message, headers=headers)
        return result

test01_function.py

import requests
import config

from api.api_function import ApiFunction


class TestFunction:
    def setup(self):
        self.session = requests.session()
        self.api = ApiFunction(self.session)

    def teardown(self):
        self.session.close()

    # 登录
    def test01_login(self, password="123456789", mobile="13600000011"):
        # 调用 api_login 方法获取 token 值
        config.TOKEN = self.api.api_login(password, mobile)
        # 检查 token 是否成功获取
        if config.TOKEN is not None:
            print("test成功获取到 token 值:", config.TOKEN)
        else:
            print("test获取 token 失败")

    # 获取消息通知
    def test02_message(self):
        import config
        if config.TOKEN is None:
            print("test未找到有效的 token,请先执行登录方法")
        result = self.api.api_message(config.TOKEN)
        if result.status_code == 200:
            print("test消息通知请求成功,状态码为:", result.status_code)
        else:
            print("test消息通知请求失败")


### PythonToken 的基本概念与实现 #### 什么是 TokenToken 是一种字符串形式的安全令牌,通常用于身份验证和授权。它可以在客户端和服务端之间递,用来证明用户的合法性而无需每次都重新输入用户名和密码。 --- #### 常见的 Token 类型 1. **JWT (JSON Web Token)** JWT 是目前最常用的 Token 格式之一,由三部分组成:Header、Payload 和 Signature。其结构如下所示: ```plaintext Header.Payload.Signature ``` - **Header**: 描述了签名算法以及 Token 类型。 - **Payload**: 存储声明(Claims),包括标准声明(如 `iss` 发行人)、公共声明和私有声明。 - **Signature**: 使用 HMAC SHA256 或 RSA 对前两部分进行加密生成。 在 Python 中可以通过第三方库 `PyJWT` 实现 JWT 的创建与解析[^4]。 2. **基于 Redis 的 Token** 这种方式利用 Redis 来存储 Token 及其关联数据(如用户 ID)。当服务接收到 Token 后会查询 Redis 数据库来判断 Token 是否合法及是否过期[^3]。 3. **Session-Based Token** Session Token 将用户状态保存在服务器端,每次请求都需要携带此 Token 以便识别用户的身份。 --- #### 如何生成 Token? 以下是使用 `itsdangerous` 库生成带有效期的 Token 示例: ```python from itsdangerous import TimedJSONWebSignatureSerializer as Serializer def generate_token(secret_key, salt=None, expires_in=3600): """ 生成带有有效期的 Token :param secret_key: 密钥 :param salt: 盐 :param expires_in: 超时时间(单位:秒) :return: 返回生成的 Token 字符串 """ s = Serializer(secret_key, salt=salt, expires_in=expires_in) return s.dumps({'user_id': 1}).decode('utf-8') # user_id 替换为实际用户ID ``` 上述代码中,`generate_token` 函数通过指定密钥 (`secret_key`)、盐 (`salt`) 和超时时间 (`expires_in`) 创建了一个 JSON Web Signature (JWS)[^4]。 --- #### 验证 Token 的有效性 下面是一个简单的 Token 验证逻辑示例: ```python def verify_token(token, secret_key, salt=None): """ 验证 Token 并获取其中的数据 :param token: 待验证的 Token :param secret_key: 加密时使用的密钥 :param salt: 加密时使用的盐 :return: 解析后的数据字典或者 None 表示无效 """ try: s = Serializer(secret_key, salt=salt) data = s.loads(token) # 自动检测是否过期 return data['user_id'] # 提取用户ID或其他信息 except Exception as e: return None # 如果发生异常表示 Token 无效或已过期 ``` 在此过程中,如果 Token 已经过期或被篡改,则抛出异常并返回 `None`[^1]。 --- #### 结合 Flask 和 Redis 实现 Token 认证 为了增强系统的可扩展性和性能,在某些场景下可以结合 Flask 和 Redis 完成 Token 的管理。具体流程如下: 1. 用户登录成功后生成唯一 Token,并将其存入 Redis; 2. 设置 Redis Key 的生存时间为 Token 的有效期; 3. 接口接收 Token 请求时先从 Redis 查询是否存在对应记录; 4. 若存在且未过期则允许访问受保护资源;否则拒绝访问。 以下是一段简化版代码片段展示如何操作: ```python import redis from flask import request, jsonify rds = redis.StrictRedis(host='localhost', port=6379, db=0) @app.route('/protected') def protected(): token = request.headers.get('Authorization') if not rds.exists(token): # 判断 Redis 中是否有对应的 Token return jsonify({"error": "Invalid or expired token"}), 401 # 获取 Token 关联的信息(例如用户ID) user_info = rds.hgetall(token) return jsonify(user_info) ``` 以上实现了基于 Redis 的 Token 验证机制[^2]。 --- #### 处理 Token 过期的情况 对于已经过期但仍需延续有效性的场景,推荐采用 Refresh Token 方案。即每当 Access Token 即将到期时自动刷新一个新的 Token 继续维持当前会话。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试小白~o(〃'▽'〃)o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值