如何解码/读取Flask文件系统会话文件?

时间:2019-07-19 00:47:49

标签: python caching flask werkzeug flask-session

我有一个使用Flask-Session(添加了服务器端会话支持)并配置为使用filesystem类型的Python3 Flask应用。

此基础类型使用Werkzeug类werkzeug.contrib.cache.FileSystemCacheWerkzeug cache documentation)。

如果打开,原始缓存文件将如下所示:

J¬».].Äï;}î(å
_permanentîàå
respondentîåuuidîåUUIDîìî)Åî}î(åintîät˙ò∑flŒºçLÃ/∆6jhåis_safeîhåSafeUUIDîìîNÖîRîubåSECTIONS_VISITEDî]îåcurrent_sectionîKåSURVEY_CONTENTî}î(å0î}î(ås_idîås0îånameîåWelcomeîådescriptionîåîå   questionsî]î}î(ås_idîhåq_idîhåq_constructîhåq_textîhå
q_descriptionîhåq_typeîhårequiredîhåoptions_rowîhåoptions_row_alpha_sortîhåreplace_rowîhåoptions_colîhåoptions_col_codesîhåoptions_col_alpha_sortîhåcond_continue_rules_rowîhåq_meta_notesîhuauå1î}î(hås1îhå    Screeningîhå[This section determines if you fit into the target group.îh]î(}î(hh/håq1îh hh!å9Have you worked on a product in this field before?

会话中存储的项目可以在上方看到: -current_section应该是整数,例如0 -SECTIONS_VISITED应该是整数数组,例如[0,1,2] -SURVEY_CONTENT格式应为具有以下结构的对象

{
  'item1': {
    'label': string,
    'questions': [{}]
  }, 
  'item2': {
    'label': string,
    'questions': [{}]
  }
}

您可以在上面的摘录中看到,例如文本This section determines if you fit into the target group是一个标签的值。 questions之后的内容是可以在每个questions对象中找到的键,例如q_text及其值,例如Have you worked on a product in this field before?是{{1的值}}。

我需要从存储的缓存文件中检索数据,这样我就可以读取它们而无需使用所有q_text之类的多余字符。

我尝试像这样使用Werkzeug,其中项å是我要读取的缓存文件的名称。但是,在缓存目录中找不到它。

9c3c48a94198f61aa02a744b16666317

有什么方法可以读取缓存文件?

我在Flask-Session中打开了一个GitHub issue,但多年来并没有得到积极维护。

对于上下文,我有一个实例,其中我的Web应用程序短暂无法写入数据库-但我需要的数据也保存在会话中。因此,现在检索数据的唯一方法是从这些文件中获取数据。

编辑:

由于蒂姆的回答,我使用以下方法解决了该问题:

from werkzeug.contrib.cache import FileSystemCache
cache_dir="flask_session"
mode=0600
threshold=20000
cache = FileSystemCache(cache_dir, threshold=threshold, mode=mode)
item = "9c3c48a94198f61aa02a744b16666317"
print(cache.has(item))
data = cache.get(item)
print(data)

我需要加载文件中所有腌制的对象,因此我将Tim的解决方案与此处的解决方案结合使用,以加载多个对象:https://stackoverflow.com/a/49261333/11805662

没有这个,我只是看到第一个腌制食品。

另外,如果有人遇到相同的问题,我需要使用与Flask应用程序(related post)相同的python版本。如果没有,则会出现以下错误:

import pickle
obj = []
with open(file_name,"rb") as fileOpener:
    while True:
        try:
            obj.append(pickle.load(fileOpener))
        except EOFError:
            break
print(obj)

1 个答案:

答案 0 :(得分:0)

您可以用pickle解码数据。 Pickle是Python标准库的一部分。

import pickle

with open("PATH/TO/SESSION/FILE") as f:
    data = pickle.load(f)