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 相关文章推荐
Python2随机数列生成器简单实例
Sep 04 Python
浅谈python中的占位符
Nov 09 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
python3利用Socket实现通信的方法示例
May 06 Python
24式加速你的Python(小结)
Jun 13 Python
python实时检测键盘输入函数的示例
Jul 17 Python
Djang的model创建的字段和参数详解
Jul 27 Python
python之列表推导式的用法
Nov 29 Python
Python 如何展开嵌套的序列
Aug 01 Python
如何解决.cuda()加载用时很长的问题
May 24 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
动态添加js事件实现代码
2009/03/12 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
js实现日历与定时器
2017/02/22 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
通过C++学习Python
2015/01/20 Python
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python入门之后再看点什么好?
2018/03/05 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
护理专业学生的求职信范文
2013/12/11 职场文书
优秀员工演讲稿
2014/05/19 职场文书
大学生工作求职信
2014/06/23 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
新党员入党决心书
2015/09/22 职场文书
小学中队长竞选稿
2015/11/20 职场文书
成人成长感言如何写?
2019/08/16 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
SQL SERVER中的流程控制语句
2022/05/25 SQL Server