python - 为什么即使在 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
”添加到购物篮列表后,列表现在同时包含两者apple
,orange
甚至在我刷新/cart/
路线时也是如此。即使在新请求中,对列表所做的更改basket
似乎也会持续存在。
我本来希望basket
列表变量在新请求中“重置”到其原始状态,因为我没有做任何事情来持久化更改。
如果我碰巧有一个充当标志的变量,则先前的请求会更改影响下一个请求的标志的值。然后这些请求变得相互依赖。
我如何确保某人在先前请求中所做的更改最终不会影响另一个人的单独请求?
解决方案
我没有做任何事情来坚持更改
但你做到了。
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 应用程序
推荐阅读
- linux - Qt Creator 开放框架“必须使用 -fPIC 重新编译”
- mongoose - 猫鼬填充显示模式尚未注册模型填充
- putty - ubuntu-16.10 找不到包
- c# - 在 ASP.NET MVC 中安排引导弹出窗口
- django - 如何通过 django 中的函数更改日期时间值?
- java - 单例 json 从数据库获取数据到我的应用程序
- wso2 - org.wso2.carbon.apimgt.gateway.handlers.security.APISecurityException:访问后端服务以进行 API 密钥验证时出错
- java - 访问工作区外的文件夹
- angular - 导入页面时出现Angular 5主机绑定组件错误
- node.js - lodash 是否内置在 Node 中?