Django中的Singleton对象行为

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

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,'page1':page1})

使用Singleton的原因是,类对象只有很少的成员来定义文件夹/内容/当前folder_id等的状态。因此,不应为每个视图都创建该对象。它需要重用

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

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

zzxx1z2x 回答:Django中的Singleton对象行为

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

如果要在请求之间维护每个用户的状态,则必须使用一些共享存储,其中最明显的解决方案是会话。

  

我能获得涉及类似情况的资源的任何参考吗?

使用会话? That's fully documented

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

  

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

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

这里您只是在阅读资源,因此您想使用GET请求。

本文链接:https://www.f2er.com/3117647.html

大家都在问