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检测是文件还是目录的方法
Jul 03 Python
ansible作为python模块库使用的方法实例
Jan 17 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
基于python全局设置id 自动化测试元素定位过程解析
Sep 04 Python
python爬虫之遍历单个域名
Nov 20 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
详解Python 函数参数的拆解
Sep 02 Python
总结三种用 Python 作为小程序后端的方式
May 02 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 动态添加记录
2009/03/10 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
jquery 上下滚动广告
2009/06/17 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
JS定时器实例
2013/04/17 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Django返回json数据用法示例
2016/09/18 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python中requests和https使用简单示例
2018/01/18 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
python3实现字符串操作的实例代码
2019/04/16 Python
python中时间模块的基本使用教程
2019/05/14 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"
2020/11/17 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
解除财产保全担保书
2014/05/20 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
行政介绍信范文
2015/05/04 职场文书
小学教师见习总结
2015/06/23 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书