现在很多框架都实现前后端分离,主要为了适应以下几个目的:

1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签

2,是为了适应跨域调用或者多客户端调用,如你的手机应用调用某个接口,大都是调用第三方api等

所以在整合JWT,让框架具有更多的适应性。JWT 说简单就是基于token的权限验证;flask 有提供json的支持,可是对象转化是一个大问题;

其实,也不用彻底转化为对象,能满足字典存取值就足够;如果有时间就考虑完善这个整合框架成一个快捷开发框架。

第一步:flask 整合 flask_login 

1) 配置user类

class User(UserMixin,db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(), unique=True, nullable=False)
email = db.Column(db.String(), unique=True, nullable=False)
password= db.Column(db.String())
avatar_hash = db.Column(db.String())
session_token='123213dsfw3432' def __init__(self,id,username,email):
self.id = id
self.username = username
self.email = email def get_id(self):
return self.session_token def __repr__(self):
return '<User %r>' % self.username

其中的get_id(self)是针对token验证提供,目的是根据token去数据库查询用户,但其实是没用作用的,因为数据库根本就没存这东西,也没有在

@login_manager.user_loader定义下函数使用;
2) 配置 view的回调函数
@login_manager.user_loader
def load_user(userid):
user = getUserById(userid)
return user @login_manager.request_loader
def load_user_from_request(request):
api_key = request.headers.get('Authorization')
print(api_key)
if api_key:
obj = jwtDecoding(api_key)
user = obj['some']
if user:
user = getUserById(user['id'])
return user
else:
print("is exception !!!!"+str(obj['error_msg']))
return None
@login_manager.request_loader 是对每次请求时,对应请求头的token做验证的,具体可以去看看官方文档,不再重复。

3)配置启动apps

具体的内容如下:
from flask import Flask, request,make_response

from flask_login import LoginManager

login_manager = LoginManager()

def create_app(config=None):
app = Flask(__name__)
#app.config.from_object(config)
if config is not None:
app.config.from_pyfile(config)
# send CORS headers
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
if request.method == 'OPTIONS':
response.headers['Access-Control-Allow-Methods'] = 'DELETE, GET, POST, PUT'
headers = request.headers.get('Access-Control-Request-Headers')
if headers:
response.headers['Access-Control-Allow-Headers'] = headers
##response.headers['Authorization'] = 'xiaominggessdfs3432ds34ds32432cedsad332e23'
return response from apps.model1 import db
db.init_app(app) login_manager.session_protection = "strong"
login_manager.init_app(app) from apps.test1.view import init_api
init_api(app) return app

到这里说明 flask_login 整合ok了

第二步,整合pyjwt

1)首先定义一个jwt使用的工具类:

import jwt
import datetime
import hashlib SECRECT_KEY = 'secret' def md5Encoding(youstr):
m=hashlib.md5()
m.update(youstr)
encodingstr=m.hexdigest()
print(encodingstr) # 生成jwt 信息
def jwtEncoding(some,aud='webkit'):
datetimeInt = datetime.datetime.utcnow() + datetime.timedelta(seconds=)
print(datetimeInt)
option = {
'exp':datetimeInt,
'aud': aud,
'some': some
}
encoded2 = jwt.encode(option, SECRECT_KEY, algorithm='HS256')
return encoded2 # userInfo = {
# "id":,
# "username":"",
# "email":"23423dsd"
# }
#
# listr = jwtEncoding(userInfo)
# print(listr.decode()) # 解析jwt 信息
def jwtDecoding(token,aud='webkit'):
decoded = None
try:
decoded = jwt.decode(token, SECRECT_KEY, audience=aud, algorithms=['HS256'])
except jwt.ExpiredSignatureError :
print("erroing.................")
decoded = {"error_msg":"is timeout !!","some":None}
except Exception:
decoded ={"error_msg":"noknow exception!!","some":None}
print("erroing2.................")
return decoded

2)整合pycharm到flask_login

其实上面红色的代码就是说明已经整合到flask_login里面去了,你是不是觉得很简单,当然还得提供一个登陆的功能,生成token:

@app.route('/login', methods=['GET', 'POST'])
def login():
str = request.get_json()
print(str)
name = str['username'] admin = User.query.filter_by(username=name).first() #这里需要重新修改成成缓存里取,减少处理时间 userInfo = {
"id":admin.id,
"username":admin.username,
"email":admin.email
} if admin == None:
return jsonify(trueReturn("{'ok':Flase}", "not the user"))
else:
#request.headers['Authorization']='liuliuyyeshibushidslfdslfsdkfkdsf23234243kds'
#login_user(admin)
token = jwtEncoding(userInfo)
print(token)
return jsonify(trueReturn("{'ok':True,'token':"+token.decode()+"}", "you are sucess"))

如果验证出错就会在 obj = jwtDecoding(api_key) 里面报错,所以在这里,你需要捕捉错误,并提示出来,工具类只是简单捕捉,这一块还需要完善一点。

3)例子演示

1,登陆:

可以看到成功,并返回token了

2,操作一些有权限要求的接口:

 @app.route('/cun')
@login_required #登陆验证要求
def getUser2():
user=utils._get_user() ##通过flask_login manage 中获取用户
print(user.__dict__)
return jsonify(trueReturn("{'ok':True}", "cun success!!!!!"))

请求前,必须加消息头Authorization ,里面的内容为token字符串,也可以自定义规范格式

3,过期效果:

jwt里面加了时间期限

有一个缺陷就是缺少日期的token 日期的刷新功能,登陆后一段时间就过期了,应该加个每次请求一段时间就刷新token的功能,

这些对于你们来说,就是小事改改就行。

源码给你们提供出来:https://files.cnblogs.com/files/minsons/teston2.zip (下载

参考:

pyJWT:https://pyjwt.readthedocs.io/en/latest/usage.html

flask_login:https://flask-login.readthedocs.io/en/latest/#flask_login.confirm_login

flask_jwt :http://pythonhosted.org/Flask-JWT/ 这个源两年多没更新了,里面其实也是调用pyjwt,建议不要用了

flask-httpauth :http://flask-httpauth.readthedocs.io/en/latest/ 也可以考虑用flask-httpauth 整合pyjwt ,也是简单挺好用的东西

flask-login 整合 pyjwt + json 简易flask框架的更多相关文章

  1. flask_login 整合 pyjwt + json 简易flask框架

    现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...

  2. Flask admin Flask login 整合模板

    项目地址: https://github.com/WES6/supflask Flask admin 官方文档: https://flask-admin.readthedocs.io/en/lates ...

  3. Django-手撸简易web框架-实现动态网页-wsgiref初识-jinja2初识-python主流web框架对比-00

    目录 自己动手实现一个简易版本的web框架 手撸一个web服务端 根据请求 url 做不同的响应处理 基于wsgiref模块实现服务端 用wsgiref 模块的做的两件事 拆分服务端代码 支持新的请求 ...

  4. 手动搭建简易web框架与django框架简介

    目录 纯手写简易web框架 基于wsgiref模块 动静态网页 简单了解jinja2模块 框架请求流程 python主流web框架 django框架 简介 应用app 命令操作django pycha ...

  5. SpringMVC 中整合之JSON、XML

    每次看到好的博客我就想好好的整理起来,便于后面自己复习,同时也共享给网络上的伙伴们! 博客地址: springMVC整合Jaxb2.xStream:  http://www.cnblogs.com/h ...

  6. 使用Node.js实现简易MVC框架

    在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...

  7. [转] 使用Node.js实现简易MVC框架

    在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...

  8. Flask最强攻略 - 跟DragonFire学Flask - 第一篇 你好,我叫Flask

    首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框 ...

  9. Flask 学习篇二:学习Flask过程中的记录

    Flask学习笔记: GitHub上面的Flask实践项目 https://github.com/SilentCC/FlaskWeb 1.Application and Request Context ...

随机推荐

  1. 单元测试,模拟用户Get登陆,并携带登录后的token访问接口

    HttpClient _httpClient; HttpClient _businessHttpClient; private async Task<string> GetAccessTo ...

  2. jmeter函数简介

    1._char:把一组数字转化成Unicode字符. 2._counter:记录线程的迭代次数. 3._CSVRead:可以从文件中指定列的值. 4.${_CSVRead(D:\test.txt,0, ...

  3. VUE中v-on:click事件中获取当前dom元素

    在开发中总是忘记, 特意在此记录 关键字:   $event     <div class="bed" v-on:click="updateBed(index,$e ...

  4. Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL

    It is everywhere in the world of MySQL that if your replication is broken because an event caused a ...

  5. od 转储 二进制文件常用命令

    od :  NAME od - dump files in octal and other formats 常用命令: ➜ Downloads od -t x1 -Ax /etc/ld.so.cach ...

  6. 【转】学习Linux守护进程详细笔记

    [原文]https://www.toutiao.com/i6566814959966093837/ Linux守护进程 一. 守护进程概述 守护进程,也就是通常所说的Daemon进程,是Linux中的 ...

  7. Amazon Redshift数据库

    Amazon Redshift介绍 Amazon Redshift是一种可轻松扩展的完全托管型PB级数据仓库,它通过使用列存储技术和并行化多个节点的查询来提供快速的查询性能,使您能够更高效的分析现有数 ...

  8. vsftp配置

    网上很多,但我还是想再整理一份属于自己的 1.vsftp简介 vsftp提供三种登陆方式:.匿名登录 .本地用户登录 .虚拟用户登录 vsftpd的特点:.较高的安全性需求 .带宽的限制 .创建支持虚 ...

  9. MySQL备份与恢复.md

    备份与恢复使用的命令 mysqldump 常用选项 -A, --all-databases:导出全部数据库 -B, --databases:导出几个数据库.参数后面所有名字参量都被看作数据库名. -- ...

  10. An Introduction to Protocol Oriented Programming in Swift

    swift面向协议编程的根本原因在于值类型的存在:面向对象必须要有引用类型的支持: Protocol Oriented approach was introduced to resolve some ...