如何在Flask中使类实例在特定会话的不同视图中可用?

1 投票
1 回答
817 浏览
提问于 2025-04-18 05:24

我正在用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变量来存储类,这样就能完全满足你的需求。我们用它来保存用户对象,特别是在我们确认用户身份之后:

http://flask.pocoo.org/docs/api/?highlight=g#flask.g

撰写回答