Python HTTP服务端sqlite3存储JWT及返回登录用户姓名实现问题
实现方案
1. 服务端代码修改
核心修改点:
- 登录验证时同步查询用户姓名字段
- 生成JWT后执行UPDATE语句并提交事务(之前更新不生效大概率是没执行commit操作)
- 结构化返回token和用户姓名给客户端
首先在服务端代码开头导入json模块:
import json
然后替换原do_POST方法为以下代码:
def do_POST(self): self.log_message('Incoming POST request...') data_passed = parse_qs(self.path[2:]) try: # 查询时同时取出姓名字段 data = cursor.execute("SELECT account, name_lastname FROM Users WHERE account=? and password=?", (data_passed['account'][0], data_passed['password'][0]), ) user_info = data.fetchone() if not user_info: self.send_response_to_client(400, 'Invalid login') else: name_lastname = user_info[1] encoded = jwt.encode({'account': data_passed['account'][0], 'exp': datetime.utcnow() + timedelta(seconds=45)}, 'secret', algorithm='HS256') # 执行token更新,必须加commit才能将修改持久化到数据库 cursor.execute("UPDATE Users SET token=? WHERE account=?", (encoded, data_passed['account'][0])) conn.commit() # 结构化返回姓名和token resp = json.dumps({ "code": 200, "name": name_lastname, "token": encoded }) self.send_response_to_client(200, resp) except KeyError: self.send_response_to_client(404, 'Incorrect parameters provided') self.log_message("Incorrect parameters provided")
2. 客户端代码修改
核心修改点:解析服务端返回的JSON结构,提取姓名字段输出欢迎语
替换原客户端代码为以下内容:
import requests import json account = input("Enter your account: ") password = input("Enter your password: ") r = requests.post("http://127.0.0.1:8079/", params={'account': account, 'password': password}) print("Request method: POST, \nResponse status_code: {}".format(r.status_code)) if r.status_code == 200: resp_data = r.json() print(f"Welcome {resp_data['name']}") print(f"Token (valid for 45 sec): {resp_data['token']}") else: print(f"Response data: {r.text}")
注意事项
- 全局Sqlite连接仅适合本地测试使用,生产环境建议每次请求创建连接或者使用连接池
- JWT签名密钥不要硬编码在代码中,建议通过环境变量配置
内容的提问来源于stack exchange,提问作者masterdeki
相关产品推荐
相关产品推荐

