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之编写类之一创建实例
Oct 11 Python
简述Python中的面向对象编程的概念
Apr 27 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
python调用OpenCV实现人脸识别功能
May 25 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
Python之时间和日期使用小结
Feb 14 Python
Python使用pyserial进行串口通信的实例
Jul 02 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
Python如何输出整数
Jun 07 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 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自动更新新闻DIY
2006/10/09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
Python读写Excel文件方法介绍
2014/11/22 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
深入理解Python3 内置函数大全
2017/11/23 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
python爬取微信公众号文章的方法
2019/02/26 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
浅谈Python中的继承
2020/06/19 Python
个人自荐信
2013/12/05 职场文书
大学生收银员求职信分享
2014/01/02 职场文书
行政主管岗位职责
2015/02/03 职场文书
科技馆观后感
2015/06/08 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python