当前位置: 首页 > news >正文

Flask一个用户同时只能在一处登录实现

场景:

           web页面如果多人用同一账号同时登录操作,可能会导致数据等的混乱甚至出现故障。并且可能损害开发者的利益。为此,本篇文章就讲下如何实现同一账户同时仅能一个地方登录操作。

思路:

          1. 用户登陆时生成token(uuid.uuid4(),保存到数据库并设定session。
2. 用户操作视图加一个装饰器,这个装饰器的功能就是验证session[“token”]和数据库里的token是否一至,不一致的话就返回登录页面,禁止操作

代码:

----app.py
----config.py
----templates (不展示)
----static (不展示)

config.py

import os
from datetime import timedelta
basedir = os.path.abspath(os.path.dirname(__file__))SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:passworld@localhost:3306/singlelogin?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False
PERMANENT_SESSION_LIFETIME=timedelta(hours=6)

app.py

from flask import Flask,jsonify,request,redirect,render_template,session
import os
from flask_sqlalchemy import SQLAlchemy
import hashlib
import uuidbasedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.secret_key = "your secret key"
app.config.from_object("config")
db = SQLAlchemy(app)class User(db.Model):__tablename__ = "users"id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64), unique=True)passwd = db.Column(db.String(128))token = db.Column(db.String(128),default=None)def __repr__(self):return self.name
with app.app_context():db.create_all()def loginVaild(fun):def inner(*args, **kwargs):userid=session.get("login_id")session_token=session.get("token")userinfo=User.query.filter_by(id=userid).first()if userinfo.token==session_token:return fun(*args, **kwargs)else:return render_template("login.html")return innerdef setPassword(password):password += "the string you like"md5 = hashlib.md5()md5.update(password.encode())result = md5.hexdigest()return result@app.route("/index",methods=["GET"])
@app.route("/",methods=["GET"])
@loginVaild
def index():print(session)return jsonify(msg="dddd")@app.route("/login",methods=["GET","POST"])
def login():if request.method == "POST":user_name = request.form.get("user_name")user_pwd = request.form.get("user_pwd")if not user_pwd or not user_name:data = "用户名和密码不能为空!"return render_template("login.html", data=data, usr=user_name)login_user = User.query.filter_by(name=user_name).first()if not login_user:data = "用户名不存在!"return render_template("login.html", data=data, usr=user_name)s_pwd = setPassword(user_pwd)if s_pwd != login_user.passwd:data = "密码错误!"return render_template("login.html", data=data, usr=user_name)session["login_name"] = user_namesession["login_id"] = login_user.idnew_token = str(uuid.uuid4())session["token"]=new_tokenlogin_user.token = new_tokendb.session.commit()return redirect("/index")return render_template("login.html")@app.route("/register",methods=["GET","POST"])
def refister():if request.method == "GET":return render_template("register.html")else:user_name = request.form.get("user_name")if User.query.filter_by(name=user_name).first():return jsonify(msg="用户名已存在!")user_pwd = request.form.get("user_pwd")user_pwd = setPassword(user_pwd)user = User(name=user_name, passwd=user_pwd)db.session.add(user)db.session.commit()return jsonify(msg="SUCCESS")if __name__ == '__main__':app.run(host="0.0.0.0",port=8080)

如有错误,欢迎斧正

http://www.lryc.cn/news/607380.html

相关文章:

  • Linux网络:多路转接 epoll
  • CentOS7下同步时间的几种方式(NTP 、Chrony和systemd-timesyncd)
  • iPhone 恢复出厂设置是否会删除所有内容?
  • iPhone查看App日志和系统崩溃日志的完整实用指南
  • 用落霞归雁的思维框架推导少林寺用什么数据库?
  • Syzkaller实战教程6:[重要]初始种子加载机制剖析第二集
  • 使用 Docker 部署 Label Studio 时本地文件无法显示的排查与解决
  • 无人机自动跟随模块技术分析
  • Docker 实战 -- Nextcloud
  • 【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)
  • Java 日期时间处理:分类、用途与性能分析
  • 前端学习日记(十七)
  • Ant 构建java项目
  • FastDDS (SharedMemory)
  • webpack面试题及详细答案80题(41-60)
  • C++ 前缀和、双指针
  • Node.js中Buffer的用法
  • 嵌入式第十七课!!!!位运算!!!
  • 考取锅炉司炉工证需要学习哪些专业知识?
  • Linux 用户与组管理:从配置文件到实操命令全解析
  • golang的函数
  • YOLO V11 + BotSort行人追踪定位项目
  • 风光储并离网切换仿真模型(下垂控制一次调频)
  • 详解K8s集群搭建:从环境准备到成功运行
  • 【问题思考总结】CART树如何剪枝?从CART树的生成到剪枝以及为什么CTt一定小于Ct?【图文】
  • 在多租户或多服务共享 Redis 时,如何做逻辑隔离或权限控制?
  • 【数据结构】-----排序的艺术画卷
  • ESD监控系统确保工厂生产设备的静电安全
  • 浏览器【详解】内置Observer(共五种,用于前端监控、图片懒加载、无限滚动、响应式布局、生成安全报告等)
  • cesium FBO(四)自定义相机渲染到Canvas(离屏渲染)