实现这一目标的方法很少
1。通过使用与服务器的持久连接。
你可以使用django-channels 之类的东西来创建一个开放的连接。这样,您可以将数据框实例关联到连接并对其进行更改。
示例代码
class DataframeWebsocketHandler(WebsocketConsumer):
def connect(self):
self.accept()
self.df = pandas.DataFrame(data=d) # your own implementation here.
# send your initial data
self.send(text_data=json.dumps({
'data': self.df
}))
def disconnect(self, close_code):
pass
def receive(self, text_data):
text_data_json = json.loads(text_data)
# you will receive actions to perform here
# all actions you take on self.df will persist until websocket is closed
operation = text_data_json['operation']
perform_operation(self.df,operation)
# send changed data to the client
self.send(text_data=json.dumps({
'data': self.df
}))
2。通过使用 pkl 和 django 缓存
您可以将当前修改后的数据帧存储到 pickle 中,并将其存储在 cache 中。
当被要求修改相同的内容时,您可以稍后加载。
示例代码
from django.core.cache import cache
# ... your code
def new_dataframe_page(request):
# ... your code
df = pandas.DataFrame(data=d)
cache.put(some_inst_specific_key,pickle.dumps(df),3000)
request.session.put('dframe_cache',some_inst_specific_key)
def update_dataframe(request):
# ... your code
cache_key == request.session.get("dframe_cache")
df = None
if cache_key && cache.get(cache_key) is not None:
df = pickle.loads(cache.get(cache_key))
else:
# generate new cache normally and store it to session just like above
df = generate_dataframe(request)
# perform your current action on dataframe
cache.put(cache_key,pickle.dumps(df))
# return your modified dataframe.
3。 (最简单且不推荐)具有全局变量:
维护一个存储各种状态的全局映射变量,当用户要求修改时,直接使用该全局映射中的变量。这种方法很简单,而且不太复杂。但不幸的是,这在生产环境中不起作用。要为 django 提供服务,您通常会运行多个 django 实例,每个实例都有自己的运行时。因此,例如,如果您正在运行 15 个 django 实例,那么所有 15 个实例都将具有单独的全局变量,并且其中一个的任何更改都不会反映在其他实例中。