在多个烧瓶视图中访问类实例?

时间:2015-05-17 22:19:15

标签: python flask

假设我有一个类,它存储重要的动态数据,我需要渲染我的网站。这个类应该按用户单独创建,并且类中的数据需要根据一些用户输入进行更新,所以我至少有两个视图:

<script>
(function($) {$(document).ready(function() {
  $('#carousel-454586').carousel({
    interval: 4000,
  });
});})( jQuery );
</script>

当然,它不能以这种方式工作,因为@app.route('/') def index(): myclass = MyClass() return render_template('index.html') @app.route('/_update', methods=['GET']) def update(): ret_data = {"value": request.args.get('c', type=float)} a = myclass.calculate(ret_data['value']) return jsonify(result=a) 中不存在myclass - 所以一个有效的解决方案是在创建时使update()全局化。但这似乎并不干净,每次会议都会破坏个别课程的可能性。

那么,是否有任何干净的方式来访问不同视图中的类实例,或者我应该如何处理它,对我来说这不是一个不常见的场景。

其次,我想为每个用户创建类实例,但是每当用户关闭浏览器窗口等时也会关闭 - 我真的不知道怎么做,我有一个{{1}我的类中的函数,但如果我将实例设置为全局,则不会使用它。

非常感谢!

2 个答案:

答案 0 :(得分:3)

您对Web应用程序的工作方式存在根本性的误解。它们是无状态:任何特定用户的请求之间不会共享任何内容。相反,任何用户碰巧接下来应用程序都可以访问任何全局变量。

为用户存储状态的方法是将其放入数据库中。您可以使用会话cookie将单个用户与其特定数据相关联。

答案 1 :(得分:0)

正如丹尼尔罗斯曼指出的那样,可能不是人们应该如何设计网络应用程序。但是,有一种方法可以使用全局变量和多个实例来实现该功能。我不太了解python来估计全局变量的使用有多么错误(甚至是危险的),但它似乎对我有用 - 我对这个解决方案的每一条评论感到高兴:

设置两个全局dicts,一个用于存储类实例,一个用于跟踪实例是否仍然相关:

global session_instances, session_alive
session_instances = {}
session_alive = {}

在我的根视图中,我创建了一个uuid,并在dict中保存了它的类实例,并启动了一个应该在一段时间后关闭我的类的线程:

@app.route('/')
def index():
    if not session.get('uid'):
        session['uid'] = uuid.uuid4()
        session_instances.update({session['uid'] : pyd2d.d2d()})
        session_alive.update({session['uid'] : 0})
        t = Thread(target=close_session, args = (session['uid'], ))
        t.start()
    return render_template('index.html')

负责关闭的线程(例如,在最后一次请求后15秒):

def close_session(uid):
    global session_alive
    while True:
        time.sleep(15)
        if session_alive[uid] == 0:
            session_instances[uid].stop()
            break
        session_alive[uid] = 0

最后,要在发送请求时随时更新计时器:

@app.before_request
def before_request():
    global session_alive
    if session.get('uid'):
        session_alive[session['uid']] = 1

这似乎工作得很好。我是否应该对使用全局变量感到不满,或者在这样的情况下是否可以?我很感激任何意见!