如何在Flask中的特定会话的不同视图中访问类实例?

时间:2014-05-05 10:49:48

标签: python flask python-2.6

我正在Flask中编写一个Web应用程序来连接虚拟机并远程运行一些shell命令。系统的流程如下:

获取VM详细信息,用户名和Pswd - >建立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 个答案:

答案 0 :(得分:0)

使用Flask的g变量存储类,它将完全按照您的意愿执行。在我们对其进行身份验证后,我们使用它来存储用户对象:

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