flask 实现token机制的示例代码


Posted in Python onNovember 07, 2019

token 的生成

用token校验身份,是前后端交互的常用方式。

它有以下特性:

  • 会失效
  • 加密
  • 可以根据它拿到用户的信息

生成方式( 内部配置的私钥+有效期+用户的id )

#导入依赖包
from flask import request,jsonify,current_app
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

def create_token(api_user):
  '''
  生成token
  :param api_user:用户id
  :return: token
  '''
  
  #第一个参数是内部的私钥,这里写在共用的配置信息里了,如果只是测试可以写死
  #第二个参数是有效期(秒)
  s = Serializer(current_app.config["SECRET_KEY"],expires_in=3600)
  #接收用户id转换与编码
  token = s.dumps({"id":api_user}).decode("ascii")
  return token

token的校验

校验接收到的token,如果成功返回用户信息,否则返回None

#基于上面的基础再导入用户的模型类
from app.model import User

def verify_token(token):
  '''
  校验token
  :param token: 
  :return: 用户信息 or None
  '''
  
  #参数为私有秘钥,跟上面方法的秘钥保持一致
  s = Serializer(current_app.config["SECRET_KEY"])
  try:
    #转换为字典
    data = s.loads(token)
  except Exception:
    return None
  #拿到转换后的数据,根据模型类去数据库查询用户信息
  user = User.query.get(data["id"])
  return user

用装饰器写一个必须携带token的校验

有很多接口是必须登录才能操作的,最好的方式就是在写一个装饰器,添加在需要的api上

#在上面的基础上导入
import functools

def login_required(view_func):
  @functools.wraps(view_func)
  def verify_token(*args,**kwargs):
    try:
      #在请求头上拿到token
      token = request.headers["z-token"]
    except Exception:
      #没接收的到token,给前端抛出错误
      #这里的code推荐写一个文件统一管理。这里为了看着直观就先写死了。
      return jsonify(code = 4103,msg = '缺少参数token')
    
    s = Serializer(current_app.config["SECRET_KEY"])
    try:
      s.loads(token)
    except Exception:
      return jsonify(code = 4101,msg = "登录已过期")

    return view_func(*args,**kwargs)

  return verify_token

使用案例

生成token(案例)

#此处的api是蓝图的对象
from . import api
from app.model import User,db
from flask import request,jsonify
#导入刚刚写的文件方法
from app.utils.common import create_token,login_required,verify_token

@api.route("/login",methods=["POST"])
def login():
  '''
  用户登录
  :return:token
  '''
  res_dir = request.get_json()
  if res_dir is None:
    #这里的code,依然推荐用一个文件管理状态
    return jsonify(code = 4103,msg = "未接收到参数")
  
  #获取前端传过来的参数
  phone = res_dir.get("phone")
  password = res_dir.get("password")
  
  #校验参数
  if not all([phone,password]):
    return jsonify(code=4103, msg="请填写手机号或密码")

  if not re.match(r"1[23456789]\d{9}",phone):
    return jsonify(code=4103,msg="手机号有误")

  try:
    user = User.query.filter_by(phone=phone).first()
  except Exception:
    return jsonify(code=4004,msg="获取信息失败")

  if user is None or not user.check_password(password):
    return jsonify(code=4103,msg="手机号或密码错误")
  
  #获取用户id,传入生成token的方法,并接收返回的token
  token = create_token(user.id)
  
  #把token返回给前端
  return jsonify(code=0,msg="成功",data=token)

必须登录的校验与根据token拿到用户信息(案例)

@api.route("/user/detail")
@login_required #必须登录的装饰器校验
def userInfo():
  '''
  用户信息
  :return:data
  '''
  token = request.headers["z-token"]
  #拿到token,去换取用户信息
  user = verify_token(token)

  data = {
    "phone":user.phone,
    "name":user.name,
    "head_portrait":user.head_portrait,
    "intro":user.intro,
    "level":user.level
  }

  return jsonify(code=0,msg="成功",data=data)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Web框架Flask中使用七牛云存储实例
Feb 08 Python
为Python程序添加图形化界面的教程
Apr 29 Python
Numpy数组的保存与读取方法
Apr 04 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
Jan 08 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
python实现键盘输入的实操方法
Jul 16 Python
python openCV获取人脸部分并存储功能
Aug 28 Python
python绘制随机网络图形示例
Nov 21 Python
基于python实现操作git过程代码解析
Jul 27 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
python GUI计算器的实现
Oct 09 Python
Python3的进程和线程你了解吗
Mar 16 Python
python3反转字符串的3种方法(小结)
Nov 07 #Python
Python中__repr__和__str__区别详解
Nov 07 #Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 #Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 #Python
Python中xml和dict格式转换的示例代码
Nov 07 #Python
python对象转字典的两种实现方式示例
Nov 07 #Python
python多线程高级锁condition简单用法示例
Nov 07 #Python
You might like
PHP 编程的 5个良好习惯
2009/02/20 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python实现文件复制删除
2016/04/19 Python
Python语言描述随机梯度下降法
2018/01/04 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
python属于跨平台语言码
2020/06/09 Python
python基于openpyxl生成excel文件
2020/12/23 Python
Python的collections模块真的很好用
2021/03/01 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
化妆师职业生涯规划书
2014/02/16 职场文书
售后服务承诺书
2014/03/26 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python