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操作日期和时间的方法
Mar 11 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
pyqt5简介及安装方法介绍
Jan 31 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
django-rest-swagger的优化使用方法
Aug 29 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
python输出pdf文档的实例
Feb 13 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 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+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
用js重建星际争霸
2006/12/22 Javascript
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python计算牛顿迭代多项式实例分析
2015/05/07 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
给国外客户的邀请函
2014/01/30 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
企业消防安全责任书
2014/07/23 职场文书
天坛导游词
2015/02/02 职场文书
大连星海广场导游词
2015/02/10 职场文书
办公室禁烟通知
2015/04/23 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers