Akh*_*_IN 3 python django rest pandas django-rest-framework
场景:我正在处理django和django rest framework中的数据pandas dataframe。
在前端,有一些函数可以应用于相同的数据。用户可以应用第一个函数,然后数据集将根据应用的函数而变化,然后用户可以应用另一个函数,依此类推。
在后端。我让所有功能井井有条。循环它并给出响应。我的问题是,我每次都在执行从第一个函数到最后一个函数的整个过程,这使得我的过程变慢。
有没有一种好方法来保留状态并仅处理最后一个函数。??
你有几种方法可以实现这一目标
您可以使用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
}))
Run Code Online (Sandbox Code Playgroud)
您可以将当前修改的数据帧存储到 pickle 中并将其存储在缓存中。您可以稍后在要求修改时加载它。
示例代码
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.
Run Code Online (Sandbox Code Playgroud)
维护一个存储各种状态的全局映射变量,当用户要求修改时,直接使用该全局映射中的变量。这种方法很简单,也不那么复杂。但不幸的是这在生产环境中不起作用。为了服务 django,您通常运行多个 django 实例,并且每个实例都有自己的运行时。例如,如果您正在运行 15 个 django 实例,那么所有 15 个实例都将具有单独的全局变量,其中一个实例的任何更改都不会反映在其他实例中。
| 归档时间: |
|
| 查看次数: |
1341 次 |
| 最近记录: |