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拼接微信好友头像大图的实现方法
Aug 01 Python
python dlib人脸识别代码实例
Apr 04 Python
python实现趣味图片字符化
Apr 30 Python
python3实现小球转动抽奖小游戏
Apr 15 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
python环境下安装opencv库的方法
Mar 05 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
基于Python绘制个人足迹地图
Jun 01 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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函数解决SQL injection
2006/12/09 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP安全下载文件的方法
2016/04/07 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
2016/12/17 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
Python3.2中Print函数用法实例详解
2015/05/19 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
Hibernate持久层技术
2013/12/16 面试题
玲玲的画教学反思
2014/02/04 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
农村改厕实施方案
2014/03/22 职场文书
网络信息安全承诺书
2014/03/26 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
2015年药店店长工作总结
2015/04/29 职场文书