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

标签 python flask thread-safety

我正在使用带有 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+')
这个类当然过于简化了。我在 __init__.py 中初始化了一个实例并将其导入所有路由文件(我正在使用 BluePrints)。
我的应用程序是线程化的,所以这个类可能不起作用......因为多个用户同时编辑数据。有人有其他解决方案吗?
笔记:g变量不起作用,因为数据在 之间共享用户 不是 请求 .
另外,如果我想每周增加这样的变量怎么办?运行单独的python脚本来跟踪日期或检查每个服务器请求的日期是否是线程安全的?

最佳答案

您肯定会以不一致的状态结束,如果没有读取和写入之间的锁定机制,您将遇到竞争条件。所以你会失去一些增量。
此外,您没有关闭打开的文件,如果这样做的次数足够多,它会使应用程序崩溃。
还有一个很好的建议是,您不想编写状态管理软件,(数据库)很难做到正确。
我认为在您的情况下,最好的解决方案是使用 sqlite,因为它是您从应用程序调用的库,没有额外的服务器。
“我可以制作一个数据库来保存它,但我想要更简单灵活的东西”
在多线程应用程序中,您不能比 sqlite 更简单(如果您希望您的应用程序正确无误)。
如果您不喜欢 SQL,那么还有一些更简单的选择:

  • zodb http://www.zodb.org/en/latest/guide/transactions-and-threading.html
  • pikleDB https://github.com/patx/pickledb
  • python 搁置但是你需要使用文件系统锁
  • 关于python - 如何保存和编辑服务器渲染数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338942/

    相关文章:

    python - 如何确保注册的 atexit 函数将与 PyObjC 中的 AppHelper.runEventLoop() 一起运行?

    python - 如何更改 Flask 中入口点文件的名称?

    java - Spring和Hibernate : Multiple connections,线程安全

    java - 如果两个线程连接在一起并且其中一个由于某种原因中止,会发生什么

    python - 将嵌套字典中的键和值从列表格式获取到数据帧中

    python - 复杂的数学公式 Python

    python - 无法在 postgresql sqlalchemy 中创建表

    python - flask 中的@app.errorhandler(Exception) 不会捕获无效路由

    javascript - 使用 Google App Engine Flask dev_appserver.py 运行本地开发时,Chrome 不会刷新静态 JS 文件

    Java JProgressBar 不通过 setVisible(true) 显示