当前位置: 首页 > 面试题库 >

在flask应用程序中保留全局状态

令狐嘉禧
2023-03-14
问题内容

我正在尝试在flask应用程序中保存缓存字典。

据我了解,应使用Application Context,尤其是flask.g对象。

设定:

import flask as f

app = f.Flask(__name__)

现在,如果我这样做:

with app.app_context():
    f.g.foo = "bar"
    print f.g.foo

它打印bar

继续执行以下操作:

with app.app_context():
    print f.g.foo

AttributeError: '_AppCtxGlobals' object has no attribute 'foo'

我不明白,文档也完全没有帮助。如果我正确阅读它们,状态应该已经保留。

我的另一个想法是简单地使用模块范围的变量:

cache = {}

def some_function():
    cache['foo'] = "bar"

但是似乎这些随着每个请求而重置。

如何正确做到这一点?

编辑:flask10.1


问题答案:

根据你的问题,我认为你对“全局”的定义感到困惑。

在常规Flask设置中,你将拥有一台Flask服务器,该服务器具有多个线程以及可能有多个处理请求的进程。假设你有一个股票全局变量,例如“ itemlist = []”,并且你希望在每个请求中(例如,每次有人向端点发出POST请求时)都继续添加该变量。这在理论和实践上都是完全可能的。这也是一个非常糟糕的主意。

问题在于,你无法轻松控制哪些线程和进程“获胜”-列表可能会以一个非常古怪的顺序出现,或者完全损坏。因此,现在你需要讨论锁,互斥锁和其他原语。这是困难而烦人的。

你应该使Web服务器本身尽可能保持无状态。每个请求应该完全独立,并且不共享服务器中的任何状态。而是使用将为你处理状态的数据库或缓存层。这似乎更复杂,但实际上实际上更简单。以SQLite为例; 这很简单。

要解决“ flask.g”对象,即基于每个请求的全局对象。



 类似资料:
  • 问题内容: 我正在使用flask,并尝试执行以下操作。 我已经定义了一个main.py文件,通过它我可以运行我的应用程序,即 我定义了一个名为view的程序包,在其中将声明不同的view模块,每个模块都有自己的路由。 因此,我需要在main.py中具有用于运行服务器的全局应用程序对象,以及在包的视图类中用于注册路由的全局对象。那么,如何创建全局应用程序对象并在所有类之间共享呢? 问题答案: 可以从

  • 我有一个Flask应用程序在Gunicorn下运行,使用同步工作进程类型和20个工作进程。该应用程序在启动时读取大量数据,这需要时间和内存。更糟糕的是,每个进程都加载自己的副本,这会导致它花费更长的时间,占用20倍的内存。数据是静态的,不会更改。我想加载一次,让所有20名员工共享。 如果我使用设置,它只加载在一个线程中,并且最初只需要1X内存,但是一旦请求开始进来,它似乎会变成20X。我需要快速随

  • 我是一个新的React Native,我正在尝试改变一个位于一个屏幕中的类组件中的算术函数的状态,然后在全局共享它,以便在不同的屏幕中使用它,并且可能改变它,有哪些方法可以做到这一点?

  • 我需要在全球ZF1项目上添加CSRF保护。我知道如何添加单个表单,但我已经在项目中创建了很多表单。所以,为每一种形式做这件事是非常乏味和耗时的工作。我需要一个插件或ZF1的任何库,它在每个表单元素的顶部添加一个层,并在每个表单上使用CSRF令牌接收post请求。我们高度赞赏实现这一点的任何逻辑。

  • 我试图把我的头缠在这个问题上2天现在,我找不到任何正确的解决方案在网上和论坛上这个问题。 我无法使用@login\u required decorator在flask应用程序中保护dash应用程序。我可以使用blueprint route中的@login\u调用dash应用程序,以确保其安全并将其重定向到dash应用程序。 但是如果我直接调用dash-applike_localhost:5000/

  • 问题内容: 我有一个现有的Flask应用程序,并且想找到通往另一个应用程序的路线。更具体地说,第二个应用程序是Plotly Dash应用程序。如何在现有的Flask应用程序中运行Dash应用程序? 我还尝试将路由添加到Dash实例,因为它是Flask应用程序,但出现错误: 问题答案: 从文档: 基本的Flask应用程序可从访问app.server。 你还可以将自己的Flask应用实例传递到Dash