在 Django 中全局存储动态变量

Posted

技术标签:

【中文标题】在 Django 中全局存储动态变量【英文标题】:Store dynamic variables in Django globally 【发布时间】:2021-06-29 21:16:57 【问题描述】:

如何在 Django 中全局存储变量,以便我可以访问所有 Django 文件中的变量? 例如,当在 views.py 中将变量声明为全局变量时,它在其他文件(包括 routing.py>consumers.py)中没有相同的内存。注意:我正在使用 websockets 和通道。

要存储的变量是一个包含类(客户端)及其单独套接字连接(不是 websocket)的列表,因此无法将其存储在数据库中。

我正在制作一个反向 shell 的网络版本。然后受害者/客户端将连接到服务器,我将能够通过套接字连接向他们发送命令。它在常规终端中运行良好,因为它是我一开始创建项目的地方。

有人知道怎么做吗?

all_clients = []
class Client():
    def __init__(self, clientSocket, name, ip, port, permission, time_when_connected):
        self.clientSocket = clientSocket
        self.name = name
        self.ip = ip
        self.port = port
        self.permission = permission
        self.time_when_connected = time_when_connected

【问题讨论】:

为什么不能把这个变量写入数据库?您是否考虑过会话:docs.djangoproject.com/en/dev/topics/http/sessions? @Someprogammer 这行得通吗,所以它不仅仅是网页的每个访问者?即使其他人访问该页面,数据也必须保持一致。 【参考方案1】:

在您的目标模块中,将列表all_clients 替换为字典。将所有客户存储在其中作为参考:

clients =  'all': [] 
# all_clients = []

当从另一个模块使用时,数据会通过模块导入保持:

from client_app.views import clients #above object
all_clients = clients['all'] 

由于在 python 运行时中的引用,这不能确保返回“当前”客户端对象的真实引用,因此在与“客户端”相同的模块中创建一个函数参考:

clients =  'all': [] 
# all_clients = []

def get_all_clients():
    return clients['all']

你可以应用一些兄弟函数来帮助:

def add_client(entity):
    clients['all'].append(entity)

在你的 other 模块中,导入并使用函数:

from client_app.views import get_all_clients, add_client

c = Client()
add_client(c)
all_clients = get_all_clients()
assert c in all_clients

这是由于Lists的对象引用,更多可以看这里:https://docs.python.org/3/faq/programming.html#how-do-i-share-global-variables-across-modules。

列表是可变的,但由于目标模块的导入,对列表的引用可能不会产生其他模块的引用:Python: Import list from other module

不过,上面的模式效果很好。

【讨论】:

以上是关于在 Django 中全局存储动态变量的主要内容,如果未能解决你的问题,请参考以下文章

对于静态变量和动态变量

静态存储变量STATIC有啥用举个例吧,好像和全局变量还有些联系啊

C语言动态变量和静态变量的区别

变量存储类别

c++存储区

全局变量 静态变量 局部变量 啥时候创建 啥时候撤销