Zappa Django:它不是重新查询数据库,而是使用过时的内存缓存。这种行为可以改变吗?

Zappa Django: instead of re-querying the database, it uses an outdated in-memory cache. Can this behavior be changed?

在我的项目中,我只使用 Django 作为前端。所有后端逻辑都是由状态机协调的几个 AWS Lambda Python 函数。数据库是 S3 存储桶中的 SQLite。我使用 django_s3_storagedjango_s3_sqlite。我的后端函数更改了模型实例的数量及其在 SQLite 数据库中的详细信息。我希望 Django 前端尽快反映这些更改。但是,它不会发生。我只看到过时的内存缓存。

我已经尝试了几种方法。

我的初步看法:

class AllPortfolioRowsView(ListView):
    model = PortfolioRow
    template_name = "portfolio_all_rows.html"
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # do something else
        context['object_list'] = PortfolioRow.objects.all().order_by('row_type')
        return context

我已阅读在 get 函数中执行操作的建议。在这种情况下,按理来说,每次调用该函数都必须执行对数据库的查询。

变体 #2:

class AllPortfolioRowsView(View):
    def get(self, request):
        template = loader.get_template('portfolio_all_rows.html')
        object_list = PortfolioRow.objects.all().order_by('row_type')
        # do something else
        context = {
            'object_list': object_list,
            # other stuff
        }
        return HttpResponse(template.render(context, request))

它有效但没有帮助。

然后我尝试按照 Django 文档的建议强制查询数据库。

变体 #3:

class AllPortfolioRowsView(View):
    def get(self, request):
        template = loader.get_template('portfolio_all_rows.html')
        object_list = PortfolioRow.objects.all().order_by('row_type')       
        for elem in object_list: # iteration
            counter = counter + 1
            print(counter, ' - ', elem)
        _ = list(object_list)        # create list to force re-evaluation
        # do something else
        context = {
            'object_list': object_list,
            # other stuff
        }
        return HttpResponse(template.render(context, request))
    

也没用。

仅在 zappa-settings.json 中禁用周期性 keep_warm 事件有帮助。之后,如果没有调用,服务器会在 10-15 分钟后释放,过时的缓存就会消失。下次调用时,系统不得不重新查询数据库并显示最近的数据。

有更好的解决方案吗?

您的 Django Lambda 容器实例将在加载时下载 SQLite 数据库,然后将文件缓存在本地,直到 AWS 关闭 Lambda 容器。这是由 django_s3_sqlite 包自动完成的。

由于您使用单独的后端系统对数据库进行写入,因此 Django Lambda 容器实例不知道更改,因此不会从 S3 重新下载 SQLite 数据库。你列出的功能都是基于Django的缓存,不会有任何效果。

如果您希望 Django 应用程序在更快的时间内反映数据库更改,您将需要迁移到集中式数据库,例如 RDS 上的 PostgreSQL 或 DynamoDB。