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

Posted

技术标签:

【中文标题】如何解码/读取 Flask 文件系统会话文件?【英文标题】:How to decode/read Flask filesystem session files? 【发布时间】:2019-11-27 23:06:46 【问题描述】:

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

此类型底层使用 Werkzeug 类 werkzeug.contrib.cache.FileSystemCache (Werkzeug 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?q_text 的值。

我需要从存储的缓存文件中检索数据,以便我可以读取它们而无需像å 这样的所有额外字符。

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

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)

有哪些方法可以读取缓存文件?

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

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

编辑:

感谢蒂姆的回答,我使用以下方法解决了这个问题:

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

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

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

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

ValueError: unsupported pickle protocol: 4

【问题讨论】:

文件是数据pickled。见github.com/pallets/werkzeug/blob/0.15.x/src/werkzeug/contrib/… 【参考方案1】:

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

import pickle

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

【讨论】:

以上是关于如何解码/读取 Flask 文件系统会话文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何读取 JSON 文件并传输到 Flask 组织的 HTML 中的 Javascript?

iphone,objective c,如何从音频文件中读取原始数据(未应用编解码器)

Flask配置文件和环境变量:配置文件和环境变量的读取与调用

如何在 jinja 2 - Flask 中访问会话变量

flask如何向前端传输GeoJson文件

如何使用 Python 读取图像文件? [关闭]