为什么即使在Python中的新请求中,变量也仍然保留在内存中?

时间:2018-07-03 16:10:07

标签: python flask

我注意到,即使在新请求中,在Python中声明的变量也会保留在内存中。例如:

from flask import Flask

app = Flask(__name__)

basket = ['apple']

@app.route('/cart/', methods=['POST', 'GET'])
def get_cart():
    return ', '.join(basket)

@app.route('/store/<string:name>')
def add_item(name):
    basket.append(name)
    return 'Added ' + name

app.run(port=5000)

我通过运行python app.py来启动它。

首先,列表变量basket仅包含项apple。在尝试将另一个字符串“ orange”添加到购物篮列表之后,即使刷新了apple路由,列表现在同时具有orange/cart/。即使在新请求中,对basket列表所做的更改仍会保留。

我希望在新请求中将basket列表变量“重置”为其原始状态,因为我没有做任何事情来保持更改。

如果我碰巧有一个充当标志的变量,则上一个请求将希望更改标志的值,从而影响下一个请求。然后,请求彼此依赖。

如何确保某人在先前请求中所做的更改不会最终影响到另一个人的单独请求?

1 个答案:

答案 0 :(得分:4)

  

我没有采取任何措施来保持更改

但是你做到了。

basket是一种在Flask上下文中存储的内存数据结构。每个请求都可以访问完全相同的请求。您不是在按用户分配篮子。

那将需要一个dict(),或者最好是一个数据库(例如SQLite)来存储(用户,购物篮)映射,并且您需要一种有效地确定“回头客”的方法来创建该用户对象并进行区分不同的要求。

Flask不会自动知道两个请求是由完全不同的用户触发的。

例如,假设您有某种方法可以获取登录的用户ID,则可以执行此操作以使该用户获得购物车。对于未登录的用户,您需要其他一些类似于cookie的会话,您可以跟踪这些会话以了解“来宾车”,并且需要一种使用户之间的区别独一无二的方法

@app.route('/cart/')
def get_cart():
    b = user_buckets.get(current_user_id())
    return ', '.join(b)

这不仅是“ Python的工作方式”。我确定您可以编写PHP,Java,NodeJS,或任何存储全局状态的Web应用程序