首页 > 解决方案 > Django 中的单例对象行为

问题描述

考虑我想为访问网站中特定功能的每个用户创建一个单例对象。该对象不是模型。

class NavApi:
    __instance = None

    @staticmethod
    def get_instance():
        """ Static access method. """
        if NavApi.__instance is None:
            Client()
        return NavApi.__instance

在视图文件中

@csrf_exempt
def get_folder_tree(request):
    if request.method == "POST":
        nav_api = NavAPI.get_instance()
        folders = nav_api.listing_folders(request.POST.get('id'))
        return render(request, "folder_tree.html", {'folders': folders, 'page1': False})


@csrf_exempt
def get_prev_folder_tree(request):
    if request.method == "POST":
        nav_api = NavAPI.get_instance()
        page1,folders = nav_api.listing_prev_folder_tree()
        return render(request, "folder_tree.html", {'folders': folders,'page1':page1})

使用 Singleton 的原因是类对象的成员很少,这些成员定义了文件夹/内容/当前文件夹 ID 等的状态。不应该为每个视图创建它。它需要重复使用

但是当我尝试以公共方式运行它时,使用 ngrok 并将链接分享给我的朋友,并测试导航功能,

我们最终使用了相同的单例对象。当我浏览文件夹 A 的内容,而他浏览文件夹 B 的内容时,我们最终收到了同一个文件夹(A 或 B)的内容。如何克服这一点?

标签: pythondjangodjango-modelssingleton

解决方案


Python 不是 PHP... 在典型的生产设置中,您的应用程序将由许多长期运行的进程提供服务,因此您不能期望可靠地使用进程内存作为持久全局状态(单例 IS 全局状态)的方式请求到请求 - 您可以让同一用户有两个连续的请求由不同的进程提供服务,而同一进程为两个不同的用户提供服务请求。

如果你想在请求之间维护每个用户的状态,你必须使用一些共享存储,这里非常明显的解决方案是会话。

我可以参考处理类似案例的资源吗?

使用会话?这是完整的记录

哦,是的:如果您所做的只是浏览文件夹,那么您严重滥用了 http 动词:

POST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求URI 标识的资源的新下级。

https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

这里你只是在阅读资源,所以你想使用 GET 请求。


推荐阅读