假设我有一个类,它存储重要的动态数据,我需要渲染我的网站。这个类应该按用户单独创建,并且类中的数据需要根据一些用户输入进行更新,所以我至少有两个视图:
<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}我的类中的函数,但如果我将实例设置为全局,则不会使用它。
非常感谢!
答案 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
这似乎工作得很好。我是否应该对使用全局变量感到不满,或者在这样的情况下是否可以?我很感激任何意见!