如何在Flask中使类实例在特定会话的不同视图中可用?
我正在用Flask写一个网页应用,目的是连接到一个虚拟机,并远程执行一些命令。这个系统的流程大致是这样的:
获取虚拟机的详细信息、用户名和密码 -> 建立SSH连接 -> 按照特定顺序运行预定义的命令,并接受一些用户输入。
为此,我创建了一个类,这个类可以建立SSH连接,并且有一些函数用来运行命令。
在Flask的视图函数中,每当用户登录时,都会创建这个类的新实例。这个实例用作应用的认证机制,需要让其他视图也能访问,以便为登录的用户运行命令。此外,这个实例还需要与会话相关联,也就是说,对于另一个独立的请求,需要创建一个新的类实例。
现在的问题是如何让这个类的实例变量在其他视图中可用。如果我把这个变量设为全局变量,那么它就会在整个应用中唯一,并且与会话和请求无关。
我不想在数据库中存储任何东西(比如用户信息等),因为所有操作都是即时进行的。
下面是view.py文件的一段代码:
ssh_conn是需要在其他视图中访问的变量。这个实例在其他视图中使用,比如createview,用来列出登录用户的视图。
我非常感谢任何可以得到的帮助,如果有其他方法可以实现这个目的,请也告诉我。
from flask import *
from app import app
from form import *
from ssh_connection import ssh
ssh_conn = None;
#
# index page
#
@app.route("/", methods=['GET', 'POST'])
@app.route('/index/', methods=['GET', 'POST'])
def login():
form=LoginForm()
ssh_conn = ssh()
if form.validate_on_submit():
if validate_login(request.form['vm_name'], request.form['username'], request.form['password']):
return redirect('/flow/createview/')
flash('All fields are mandatory')
return render_template("login.html", form=form);
@app.route("/flow/createview/", methods=["GET", "POST"])
def createview():
form = createViewForm()
global ssh_conn;
if form.validate_on_submit():
#TODO: add create view code
views = ssh_conn.listviews();
return render_template("createview.html", form=form, lsviews = views);
# validates login by creating an SSH connection
def validate_login(server, username, password):
global ssh_conn;
ssh_conn.__set__(server, username, password);
ssh_conn_status = ssh_conn.establish_connection();
if ssh_conn_status == 'success':
return True;
flash(ssh_conn_status);
return False;
1 个回答
1
使用Flask的g变量来存储类,这样就能完全满足你的需求。我们用它来保存用户对象,特别是在我们确认用户身份之后: