python - 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)的内容。如何克服这一点?
解决方案
Python 不是 PHP... 在典型的生产设置中,您的应用程序将由许多长期运行的进程提供服务,因此您不能期望可靠地使用进程内存作为持久全局状态(单例 IS 全局状态)的方式请求到请求 - 您可以让同一用户有两个连续的请求由不同的进程提供服务,而同一进程为两个不同的用户提供服务请求。
如果你想在请求之间维护每个用户的状态,你必须使用一些共享存储,这里非常明显的解决方案是会话。
我可以参考处理类似案例的资源吗?
使用会话?这是完整的记录
哦,是的:如果您所做的只是浏览文件夹,那么您严重滥用了 http 动词:
POST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求URI 标识的资源的新下级。
https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
这里你只是在阅读资源,所以你想使用 GET 请求。
推荐阅读
- postgresql - 分区修剪在 Postgres 11 中是否适用于更新语句
- reactjs - 用 keystonejs 插入 nextjs
- string - [LUA]计算字符串中的数字和运算符
- java - Java 如何比较 XML 数据和文件扩展名
- dynamics-crm - Microsoft 365 API:将联系人附加到活动响应时出现问题
- javascript - 根据软件版本跳过 Coffeescript 测试
- version-control - 如何组织和共享仅用于 DevOps 和自动化目的的人工制品?
- android - java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: 无法合并 dex || 安卓
- excel - 跨工作表复制公式范围
- c# - 在 KENDO Grid 中的 DATE 列字段上选择 FILTER(为 NULL 或为空)时