如何保存和编辑服务器渲染数据?

moe*_*sal 6 python thread-safety flask

我正在使用带有 python 的 Flask 服务器。

我有一个整数pics_to_show。每次收到请求时,用户都会收到pics_to_show整数。并且pics_to_show递减 1。 pics_to_show是一个与所有网站用户共享的整数。我可以制作一个数据库来保存它,但我想要更简单和灵活的东西。有没有其他方法可以保存这个整数。

我制作了一个将此类变量保存在 JSON 文件中的类。


class GlobalSate:
    def __init__(self, path_to_file):
        self.path = path_to_file
        try:
            open(path_to_file)
        except FileNotFoundError:
            f = open(path_to_file, 'x')
            f.write('{}')

    def __getitem__(self, key):
        file = self.load_file()
        data = json.loads(file.read())
        return data[key]

    def __setitem__(self, key, value):
        file = self.load_file()
        data = json.loads(file.read())
        data[key] = value
        json.dump(data, open(self.path, 'w+'), indent=4)

    def load_file(self):
        return open(self.path, 'r+')
Run Code Online (Sandbox Code Playgroud)

这个类当然过于简化了。我在 中初始化一个实例__init__.py并将其导入所有路由文件(我使用的是 BluePrints)。

我的应用程序是线程化的,所以这个类可能不起作用......因为多个用户同时编辑数据。有人有其他解决方案吗?

注意:该g变量不起作用,因为数据是跨用户共享的,而不是requests

另外,如果我想每周增加这样的变量怎么办?运行单独的python脚本来跟踪日期或检查每个服务器请求的日期是否是线程安全的?

Tom*_*der 5

您肯定会以不一致的状态结束,如果没有读取和写入之间的锁定机制,您将遇到竞争条件。所以你会失去一些增量。

此外,您没有关闭打开的文件,如果这样做的次数足够多,它会使应用程序崩溃。

还有一个很好的建议是,您不想编写状态管理软件,(数据库)很难做到正确。

我认为在您的情况下,最好的解决方案是使用 sqlite,因为它是您从应用程序调用的库,没有额外的服务器。

“我可以制作一个数据库来保存它,但我想要更简单灵活的东西”

在多线程应用程序中,您不能比 sqlite 更简单(如果您希望您的应用程序正确无误)。

如果您不喜欢 SQL,那么还有一些更简单的选择:

  1. zodb http://www.zodb.org/en/latest/guide/transactions-and-threading.html
  2. pikleDB https://github.com/patx/pickledb
  3. python搁置但你需要使用文件系统锁