首页 > 解决方案 > 为什么即使在 Python 中的新请求中,变量也会保留在内存中?

问题描述

我注意到在 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列表变量只有 item apple。在我尝试将另一个字符串“ orange”添加到购物篮列表后,列表现在同时包含两者appleorange甚至在我刷新/cart/路线时也是如此。即使在新请求中,对列表所做的更改basket似乎也会持续存在。

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

如果我碰巧有一个充当标志的变量,则先前的请求会更改影响下一个请求的标志的值。然后这些请求变得相互依赖。

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

标签: pythonflask

解决方案


我没有做任何事情来坚持更改

但你做到了。

basket是跨 Flask Context 存储的内存中数据结构。每个请求都可以访问完全相同的请求。您不是为每个用户制作一个篮子。

这将需要一个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 应用程序


推荐阅读